比较两个链接列表C Program中的各个值

时间:2014-04-22 21:24:58

标签: c struct linked-list

我正在编写一个需要横向投放64个链表的程序。 (每个节点都有一个名为val的整数变量)它需要比较每个节点,如果val等于任何列表的任何其他节点中的另一个val,它必须记录它。

我已经编写了一个横向抛出列表的函数,但在打印出它们等于崩溃的结果后,我的函数看起来像这样(n = 64):

void scanlist(int n)
{

int i = 0;
int j = 0;
    for(i=0; i < n; i++)
        {
            struct node *temp;  //Declare temp
             temp = heads[i];       //Assign Starting Address to temp

              int x = i++;
                     struct node *temp2;  //Declare temp2
                        temp2 = heads[x];       //Assign Starting Address to temp2


                    while(temp != NULL)
                    {

                        if(temp->val == temp2->val)
                            {
                                printf("theyre on the same line, %d = %d  \n", temp->val, temp2->val);
                                temp2 = temp2->next;
                                continue;
                            }

                        else if(temp->val != temp2->val)
                            {

                                temp2 = temp2->next;
                                continue;
                            }

                        else if(temp2 == NULL)
                            {
                                temp = temp->next;
                                temp2 = heads[x];
                                continue;
                            }






                    }


    }

}

我的链表代码如下所示:

struct node
 {
  int val;
  struct node *next;
} ;
 struct node* heads[64]; // array with the roots of the lists
 struct node* currs[64]; // array holding pointers to current positions in list

 struct node* create_list(int val, int listNo){
     struct node *ptr = (struct node*)malloc(sizeof(struct node));

     ptr->val = val;
     ptr->next = NULL;

     heads[listNo] = currs[listNo] = ptr;
     return ptr;
 }
void setup_list_array(int n){
    int i;

    for(i=0; i<n; i++)
        {
            heads[i] = NULL;
            currs[i] = heads[i];
        }
 }

感谢您提前提供任何帮助,希望我很清楚。

1 个答案:

答案 0 :(得分:1)

首先,对“问题”代码进行一些小评论:

void scanlist(int n)
   {
   int i = 0;
   int j = 0;

似乎'j'未使用。

   for(i=0; i < n; i++)

这或许会更有效率

for(i=0; i < (n-1); i++)  

这将避免引用最后的'head []',因为它已被比较。

      {
      struct node *temp;  //Declare temp
      temp = heads[i];       //Assign Starting Address to temp

      int x = i++;

为了将'x'初始化为'i + 1',也许'i'会递增;但是,这句话与'x = i等同; i = i + 1;',这对我来说似乎没有帮助。

      struct node *temp2;  //Declare temp2
      temp2 = heads[x];       //Assign Starting Address to temp2

由于前面提到的错误初始化'x','temp'和'temp2'现在指向相同的'head []'元素。

      while(temp != NULL)
         {
         if(temp->val == temp2->val)
            {
            printf("theyre on the same line, %d = %d  \n", temp->val, temp2->val);
            temp2 = temp2->next;
            continue;
            }
         else if(temp->val != temp2->val)

这里可以省略'else'语句。如果'(temp-&gt; val == temp2-&gt; val)'[above]计算为'TRUE','continue'语句将导致程序流回到循环的顶部。 此外,语句'if(temp-&gt; val!= temp2-&gt; val)'可以省略,因为它总是会评估为'TRUE'

            {
            temp2 = temp2->next;
            continue;
            }
         else if(temp2 == NULL)

由于这个'else'语句,如果上述'if'语句中的任何一个评估为'TRUE',则不会执行此代码。这似乎是一个缺陷。

            {
            temp = temp->next;
            temp2 = heads[x];
            continue;
            }
         }
      }
   }

下面,另一种实现此方法的方法(包含注释描述了正在发生的事情)。

void scanlist(
      int n
      )
   {
   int i;

   /* Iterate the list heads. */
   for(i=0; i < (n-1); ++i)
      {
      struct node *temp = heads[i];   // Declare temp and assign Starting Address

      /* Iterate primary list nodes. */
      while(temp)
         {
         int j;

         /* Iterate list heads to compare */
         for(j=i+1; j < n; ++j)
            {
            struct node *temp2 = heads[j];  //Declare temp2 and assign Starting Address

            /* Iterate list nodes to compare */
            while(temp2)
               {
               if(temp->val == temp2->val)
                  printf("theyre on the same line, %d = %d  \n", temp->val, temp2->val);

               temp2=temp2->next;
               }
            }
         }

      temp=temp->next;
      }

   return;
   }