c-插入双链接列表



我正试图插入到一个双链接列表中。然后,我尝试以正向和反向打印列表。我已经创建了一个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->nextnew_node->prev。在new_node->next的"赋值"中,您似乎使用了减号而不是等号。

第三,在printlist中,如果列表为空,则应将last初始化为NULL;否则,您将尝试从未定义的起点(终点)向后遍历列表。

是否希望new_node->nextnew_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));

相关内容

  • 没有找到相关文章

最新更新