簡體   English   中英

無法在循環雙向鏈表中插入元素

[英]Unable to insert elements in circular doubly linked list

我無法在這個循環雙向鏈表中插入元素。 輸入第一個元素沒有任何問題。 但是當我嘗試插入第二個元素時,就遇到了問題。 問題是:程序自行終止。 我不知道我到底哪里錯了。 任何幫助表示贊賞。 提前致謝。

#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);
}

在雙循環鏈表中,如果有一個節點,那么它就是next並且prev指針應該指向它自己。 insert()中,您正在做

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

因此, nextprev指針最終指向NULL因為startend最初設置為NULL 現在,當您在列表中插入另一個元素時,您最終將訪問NULL指針

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

這就是你觀察程序終止的原因。

插入第一個節點時,應正確設置nextprev指針。 在您的代碼中,只需在設置nextrev之前設置startend指針,如下所示:

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

額外的:

  • 使用void作為main function 的返回類型不符合標准。 main function 的返回類型應該是int
  • 遵循良好的編程習慣,始終檢查malloc返回。
  • 不要投malloc返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM