链接列表中的链接列表

时间:2015-03-06 20:54:02

标签: c linked-list

我正在尝试创建(有序)链接列表的(有序)链接列表。 list-of-list链接由其成员列表的第一个节点承载。我试图通过以下代码实现这一点,但在我尝试将第二个节点插入列表列表后,我的程序崩溃了。

这是我想要构建的数据结构的示意图: enter image description here

代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct node{
    int number;
    struct node*next;
    struct node*lsnext;
};

typedef struct node Node;
Node* insertValue(Node * list, int value);
void display(Node*);
Node* insertArr(Node * list, int value);

int main()
{

Node *globalList = NULL, *lists,*start,*save;
int nbrOfLists, listNo, nbrOfVal, valNo, val;

printf("\n Enter the number of lists:");
scanf("%d", &nbrOfLists);

if(nbrOfLists < 0)
    return -1;

for(listNo = 0; listNo < nbrOfLists; listNo++)
{
    printf("\n\n Enter the number of inputs to the list %d: \n ",listNo+1);
    scanf("%d", &nbrOfVal);
    lists = NULL;

    for(valNo = 0; valNo < nbrOfVal; valNo++)
    {
        printf("Enter node value %d:", valNo+1);
        scanf("%d", &val);
        // Here we insert the value in both lists
        lists= insertValue(lists, val);

        globalList = insertValue(globalList, val);
    }
      start=lists;
            if(listNo==0){
                save=start;
            }
            start=start->lsnext;

    printf("\n  The list %d is: ",listNo+1);
    display(lists);

}
printf("\n\n The final list is: ");
display(globalList);
printf("The first list is");
display(save);
printf("The second list is");
display(save->lsnext);  // CRASHES HERE 
return 0;
}

  Node* insertValue(Node * list, int value)
  {
  Node *newNode, *m;
  newNode = malloc(sizeof(Node));
  newNode->number=value;

 if(list == NULL)
 {
   newNode->next=NULL;
   return newNode;
 }

 if(value < list->number)
  {
   newNode->next = list;
   return newNode;
  }

 m = list;
 while(m->next)
 {
   if(value < m->next->number)
       break;
   m = m->next;
 }
 newNode->next = m->next;
 m->next = newNode;
 return list;
 }

 void display(Node*nodex){

    while(nodex)
    {
        printf("%d ->",nodex->number);
        nodex=nodex->next;
    }
}

导致我错误的是什么?

1 个答案:

答案 0 :(得分:0)

您的insertArr()功能错误。即使它的签名也是错误的。它不是将现有列表的第一个节点链接在一起,而是创建一个单独节点的垂直列表。请特别注意,它接受,而不是接受列表的头节点。

此外,即使您调用该功能的情况也是错误的。您似乎尝试链接每个列表的初始头节点,但头节点可能会随着您添加值而更改。你必须等到你有一个完整的列表,然后才知道它的最终头节点是什么;只有这样才能将该列表链接到您的列表列表中。

编辑:我首先断言您的问题是无法初始化节点的lsnext成员。如果您的insertArr()函数实际上接受由insertValue()创建的节点作为其第二个参数,那将是正确的,但它对于所呈现的代码是不正确的。实际问题是我的第一段中描述的问题的结果,insertArr()创建单独的列表的单独节点。特别是,那些单独的节点没有初始化它们的next指针。