无法在循环双向链表中插入元素
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;
......
因此,next
和 prev
指针最终指向 NULL
,因为 start
和 end
最初设置为 NULL
.现在,当您在列表中插入另一个元素时,您最终会访问 NULL
pointer
while(ptr->next != start)
ptr = ptr->next;
这就是您观察到程序终止的原因。
插入第一个节点时,应正确设置next
和prev
指针。在您的代码中,只需在设置 next
和 rev
之前设置 start
和 end
指针,如下所示:
if(start == NULL)
{
start = new_node;
end = new_node;
new_node->next = start;
new_node->prev = end;
}
附加:
- 使用
void
作为 return 类型的 main
函数不符合标准。 main
函数的 return 类型应该是 int
。
- 遵循良好的编程习惯,始终检查
malloc
return.
- 不要投
malloc
return.
我无法在此循环双向链表中插入元素。输入第一个元素没有任何问题。但是当我尝试插入第二个元素时,就遇到了问题。问题是:程序自行终止。 我不知道我到底哪里错了。 任何帮助表示赞赏。 提前致谢。
#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;
......
因此,next
和 prev
指针最终指向 NULL
,因为 start
和 end
最初设置为 NULL
.现在,当您在列表中插入另一个元素时,您最终会访问 NULL
pointer
while(ptr->next != start)
ptr = ptr->next;
这就是您观察到程序终止的原因。
插入第一个节点时,应正确设置next
和prev
指针。在您的代码中,只需在设置 next
和 rev
之前设置 start
和 end
指针,如下所示:
if(start == NULL)
{
start = new_node;
end = new_node;
new_node->next = start;
new_node->prev = end;
}
附加:
- 使用
void
作为 return 类型的main
函数不符合标准。main
函数的 return 类型应该是int
。 - 遵循良好的编程习惯,始终检查
malloc
return. - 不要投
malloc
return.