插入双向链接列表

时间:2014-08-31 19:44:01

标签: c data-structures linked-list nodes doubly-linked-list

我正在尝试插入双向链表。然后我尝试在正向和反向打印列表。我创建了一个头节点,我试图插入另一个节点,但我无法这样做。该程序显示运行时错误。 请在下面找到我的代码。任何帮助将不胜感激。

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

3 个答案:

答案 0 :(得分:1)

这里有几个问题。

首先,正如@Igor指出的那样,你没有为头部和尾部节点分配任何内存。您还应该设置tail->prev = head

其次,insertAfter设置链接指针的顺序会导致node->next在设置new_node->next之前被覆盖。这会导致new_node->next指向new_node而不是node之后的任何内容。在修改new_node->next之前,您应该设置new_node->prevnode。您似乎在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->nextnew_node相同吗?

如果没有,您最好在InsertAfter中交换这两行:

node->next = new_node;
new_node->next - node->next;