链接列表中的链接列表

时间:2015-03-08 16:02:50

标签: 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);
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;
    }
  }

1 个答案:

答案 0 :(得分:1)

此代码调用未定义的行为。特别是,您的函数addNodeBottom存在错误:如果使用start调用非NULL,则会修改成员rear->lsnext,但此时rear未初始化。我假设您打算修改start。在这里,您返回start未经修改,因此它的成员lsnext未设置为有用的任何内容,这可能最终导致分段错误。但是,原则上,对addNodeBottom的违规函数调用可能会导致程序意外终止。