繁体   English   中英

如何删除双向链表的前端节点?

[英]How can I delete the front node of my doubly linked list?

我想删除delete_first中的前端节点。

这是代码:

#include <stdio.h>
#include <stdlib.h>

typedef int element;

typedef struct DListNode {
    element data;
    struct DListNode *llink;
    struct DListNode *rlink;
} DlistNode;

void init(DListNode *phead) {
    phead->llink = phead;
    phead->rlink = phead;
}

我在debug的时候下面的部分出现了错误。

void print_dlist(DListNode *phead) {
    DListNode *p;
    for (p = phead->rlink; p != phead; p = p->rlink) {
        printf("<-| |%d| |->", p->data);
    }
    printf("\n");
}

这是我的插入代码,我认为这不是问题

void dinsert(DListNode *before, element data) {
    DListNode *newnode = (DListNode *)malloc(sizeof(DListNode));
    newnode->data = data;
    newnode->llink = before;
    newnode->rlink = before->rlink;
    before->rlink->llink = newnode;
    before->rlink = newnode;
}

我想修复delete_first代码中的一些错误,但我不知道问题是什么以及如何修复它。

void delete_first(DListNode *head) {
    head = head->rlink;
    if (head != NULL) {
        head->llink = NULL;
    }
    free(head);
}

int main() {
    DListNode *head = (DListNode *)malloc(sizeof(DListNode));
    init(head);
    printf("insert\n");
    for (int i = 0; i < 5; i++) {
        dinsert(head, i);
        print_dlist(head);
    }

    printf("\n delete \n");
    delete_first(head);
    print_dlist(head);

    free(head);
    return 0;
}

如何使用head节点删除我的前节点?

要删除双向链表的第一个节点,您必须释放head->rlink指向的节点,除非head->rlink指向head本身,如果列表为空,情况就是这样:

void delete_first(DListNode *head) {
    DListNode *p = head->rlink;
    if (p != head) {
        p->llink->rlink = p->rlink;
        p->rlink->llink = p->llink;
        free(head);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM