我正试图插入到一个双链接列表中。然后,我尝试以正向和反向打印列表。我已经创建了一个head节点,并试图插入另一个,但无法插入。程序显示运行时错误。请在下面找到我的代码。如有任何帮助,我们将不胜感激。
#include<stddef.h>
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
struct node *prev;
};
void insertAfter(struct node *node, int new_data){
if (node == NULL)
{
printf("the given previous node cannot be NULL");
return;
}
struct node* new_node = (struct node*)malloc(sizeof(struct node));
node->data = new_data;
node->next = new_node;
new_node->prev = node;
new_node->next - node->next;
if(new_node->next!=NULL)
new_node->next->prev = new_node;
}
void printlist(struct node *node){
struct node *last;
printf("Traversal in forward directionn");
while(node!=NULL){
printf("%dn",node->data);
last = node;
node=node->next;
}
printf("Traversal in backward directionn");
while(last!=NULL){
printf("%dn",last->data);
last=last->prev;
}
}
int main()
{
struct node *head;
struct node *tail;
head->data = 5;
tail->data = 10;
head->next = tail;
head->prev = NULL;
tail->next = NULL;
insertAfter(head, 8);
printf("n Created DLL is: ");
printlist(head);
return 0;
}
这里有几个问题。
首先,正如@Igor所指出的,您没有为头部和尾部节点分配任何内存。您还应该设置tail->prev = head
。
其次,insertAfter
设置链接指针的顺序导致node->next
在用于设置new_node->next
之前被重写。这导致new_node->next
指向new_node
,而不是指向node
之后的任何内容。在修改node
之前,应先设置new_node->next
和new_node->prev
。在new_node->next
的"赋值"中,您似乎使用了减号而不是等号。
第三,在printlist
中,如果列表为空,则应将last
初始化为NULL
;否则,您将尝试从未定义的起点(终点)向后遍历列表。
是否希望new_node->next
与new_node
相同?
如果没有,你最好在InsertAfter
:中交换这两行
node->next = new_node;
new_node->next - node->next;
您需要为指针的头和尾分配内存。
int main()
{
struct node *head;
struct node *tail;
head = malloc(sizeof(struct node)); //allocating memory to head
tail = malloc(sizeof(struct node)); //allocating memory to tail
head->data = 5;
tail->data = 10;
head->next = tail;
head->prev = NULL;
tail->next = NULL;
insertAfter(head, 8);
printf("n Created DLL is: ");
printlist(head);
return 0;
}
此外,永远不要强制转换malloc的返回值,因此更改:
struct node* new_node = (struct node*)malloc(sizeof(struct node));
至
struct node* new_node = malloc(sizeof(struct node));