无法在圆形双向链表中插入元素

问题描述 投票:0回答:1

我无法在此圆形双向链接列表中插入元素。输入第一个元素没有任何问题。但是,一旦我尝试插入第二个元素,就会遇到问题。问题是:程序自行终止。我不知道我到底要去哪里。任何帮助表示赞赏。预先感谢。

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

typedef struct node
{
  int data;
  struct node *next;
  struct node *prev;
}list;

list *start=NULL;
list *end=NULL;

void insert();
void display();
void reverse_display();

void main()
{
  int n;

  printf("1: Insert Elements\n");
  printf("2: Display\n");
  printf("3: Reverse Display\n");

  for(;;)
  {
    printf("Enter choice: ");
    scanf("%d",&n);

    switch(n)
    {
      case 1: insert();
      break;

      case 2: display();
      break;

      case 3: reverse_display();
      break;

      default: printf("Wrong Input!!!\n");
      exit(0);
    }
  }
}


void insert()
{
  int num;
  list *new_node , *ptr;

  printf("Enter the number: ");
  scanf("%d",&num);

  new_node = (list *)malloc(sizeof(list));
  new_node->data = num;

  if(start == NULL)
  {
      new_node->next = start;
      new_node->prev = end;
      start = new_node;
      end = new_node;
  }
  else
  {
    ptr = start;
    while(ptr->next != start)
      ptr = ptr->next;
    ptr->next = new_node;
    new_node->prev = ptr;
    new_node->next = start;
    start->prev = new_node;
    end = new_node;
  }
}

void display()
{
  list *ptr;
  ptr = start;
  printf("\nElements in original order:\n");
  if(start == NULL)
    printf("Empty List!!!\n");
  else
  {
    while(ptr->next!=start)
  {
    printf("%d\n",ptr->data);
    ptr=ptr->next;
  }
  printf("%d\n",ptr->data);
  }
}

void reverse_display()
{
  list *ptr , *temp;
  ptr = end;
  printf("\nElements in reverse order\n");
  while(ptr->prev!=end)
  {
    printf("%d\n",ptr->data);
    ptr = ptr->prev;
  }
  printf("%d\n",ptr->data);
}

c linked-list doubly-linked-list
1个回答
2
投票
if(start == NULL) { new_node->next = start; new_node->prev = end; ......

由于此,nextprev指针最终指向NULL,因为startend最初被设置为NULL。现在,当您在列表中插入另一个元素时,您最终将访问NULL指针

    while(ptr->next != start)
       ptr = ptr->next;

这就是为什么观察程序终止的原因。

[插入第一个节点时,应正确设置nextprev指针。在您的代码中,只需在设置startend之前设置nextrev指针,如下所示:

if(start == NULL) { start = new_node; end = new_node; new_node->next = start; new_node->prev = end; }

附加:

void用作main功能的返回类型不符合标准。 main函数的返回类型应为int

    遵循良好的编程习惯,请始终检查malloc返回。
  • 请勿投放malloc返回。
© www.soinside.com 2019 - 2024. All rights reserved.