我正在尝试创建(有序)链接列表的(有序)链接列表。 list-of-list链接由其成员列表的第一个节点承载。我试图通过以下代码实现这一点,但在我尝试将第二个节点插入列表列表后,我的程序崩溃了。
这是我想要构建的数据结构的示意图:
代码:
#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;
}
}
导致我错误的是什么?
答案 0 :(得分:0)
您的insertArr()
功能错误。即使它的签名也是错误的。它不是将现有列表的第一个节点链接在一起,而是创建一个单独节点的垂直列表。请特别注意,它接受值,而不是接受列表的头节点。
此外,即使您调用该功能的情况也是错误的。您似乎尝试链接每个列表的初始头节点,但头节点可能会随着您添加值而更改。你必须等到你有一个完整的列表,然后才知道它的最终头节点是什么;只有这样才能将该列表链接到您的列表列表中。
编辑:我首先断言您的问题是无法初始化节点的lsnext
成员。如果您的insertArr()
函数实际上接受由insertValue()
创建的节点作为其第二个参数,那将是正确的,但它对于所呈现的代码是不正确的。实际问题是我的第一段中描述的问题的结果,insertArr()
创建单独的列表的单独节点。特别是,那些单独的节点没有初始化它们的next
指针。