我正在尝试插入双向链表。然后我尝试在正向和反向打印列表。我创建了一个头节点,我试图插入另一个节点,但我无法这样做。该程序显示运行时错误。 请在下面找到我的代码。任何帮助将不胜感激。
#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 direction\n");
while(node!=NULL){
printf("%d\n",node->data);
last = node;
node=node->next;
}
printf("Traversal in backward direction\n");
while(last!=NULL){
printf("%d\n",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;
}
答案 0 :(得分:1)
这里有几个问题。
首先,正如@Igor指出的那样,你没有为头部和尾部节点分配任何内存。您还应该设置tail->prev = head
。
其次,insertAfter
设置链接指针的顺序会导致node->next
在设置new_node->next
之前被覆盖。这会导致new_node->next
指向new_node
而不是node
之后的任何内容。在修改new_node->next
之前,您应该设置new_node->prev
和node
。您似乎在new_node->next
的“分配”中使用了减号而不是等号。
第三,在printlist
中,如果列表为空,则应将last
初始化为NULL
;否则,您将尝试从未定义的起点(结束)点向后移动列表。
答案 1 :(得分:0)
你需要为你的指针头尾分配内存。
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));
答案 2 :(得分:0)
您希望new_node->next
与new_node
相同吗?
如果没有,您最好在InsertAfter
中交换这两行:
node->next = new_node;
new_node->next - node->next;