比较两个链表C程序中的各个值



我正在编写一个程序,该程序需要横向抛出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];
        }
 }

谢谢你提前给我的帮助,希望我是清白的。

首先,对"问题"代码的一些小评论:

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

"j"似乎未使用。

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

也许这对来说会更有效

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

这将避免引用最后一个"heads[]",因为它已经被比较过了。

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

也许"i"是递增的,以便将"x"初始化为"i+1";然而,这个陈述等价于'x=i;i=i+1;',这在我看来没有帮助。

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

由于前面提到的"x"初始化错误,"temp"one_answers"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->val=temp2->val)"[上面]的计算结果为"TRUE",则"continue"语句将导致程序流回到循环的顶部。此外,语句"if(temp->val!=temp2->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;
   }

相关内容

  • 没有找到相关文章

最新更新