我正在尝试创建(有序)链接列表的(有序)链接列表。 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);
Node* addNodeBottom(int val, Node *start);
int main()
{
Node *globalList = NULL, *lists,*start,*save;
int nbrOfLists, listNo, nbrOfVal, valNo, val;
start=NULL;
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=addNodeBottom(val,lists);
if(listNo==0){
save=start;
}
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) //to insert node at the end
{
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;
}
Node* addNodeBottom(int val, Node *start)
{
Node*rear;
Node* node1=(Node*) malloc(sizeof(Node));
node1->number=val;
node1->lsnext=NULL;
if(start==NULL){
start=rear=node1;
}
else{
rear->lsnext=node1;
rear=node1;
}
return start;
}
void display(Node*nodex){
while(nodex)
{
printf("%d ->",nodex->number);
nodex=nodex->next;
}
}
答案 0 :(得分:1)
此代码调用未定义的行为。特别是,您的函数addNodeBottom
存在错误:如果使用start
调用非NULL,则会修改成员rear->lsnext
,但此时rear
未初始化。我假设您打算修改start
。在这里,您返回start
未经修改,因此它的成员lsnext
未设置为有用的任何内容,这可能最终导致分段错误。但是,原则上,对addNodeBottom
的违规函数调用可能会导致程序意外终止。