已排序链接列表的链接列表

时间:2015-03-07 14:01:53

标签: c data-structures 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 :(得分:1)

问题是你永远不会分配lsnext节点指针。您需要确保将此指针设置为&#34; list&#34;在重置开始指针之前。你不应该需要以下代码:

start=start->lsnext;

修复了您提到的崩溃问题,但源代码有其他错误。通过GDB运行应用程序对于确保指针值是您认为应该在每个步骤中应该是什么,以及确保可读性的源代码格式化程序非常有用,可以更容易地判断哪些代码属于哪些块。