C语言实现双链表

与单链表相比,双链表前驱结点与后继结点的指针可以更方便地查找需要的结点。通过C语言可以实现双链表的判空、插入、删除与遍历操作等。注意对双链表进行操作时,需要将边界情况及处理考虑进去。

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

/*定义一个双链表*/
typedef struct DNode {
    int data;
    struct DNode* prior, * next;
}DNode,*DLinklist;
/*初始化双链表*/
bool InitDLinkList(DLinklist* L) {
    (*L) = (DNode*)malloc(sizeof(DNode));  //分配一个头结点
    if (L == NULL)                         //内存不足,分配失败
        return false;
    (*L)->prior = NULL;                    //头结点的prior永远指向NULL
    (*L)->next = NULL;                     //头结点之后暂时还没有结点
    return true;
}

/*判空*/
bool Empty(DLinklist L) {
    if (L->next == NULL)
        return true;
    else
        return false;
}

/*在p结点之后插入s结点*/
bool InsertNextDNode(DNode* *p, DNode* *s) {
    if (p == NULL || s == NULL)              //非法参数
        return false;
    if ((*p)->next != NULL)                  //如果p结点有后继结点
        (*p)->next->prior = (*s);
    (*s)->prior = (*p);
    (*p)->next = (*s);
    return true;
}
/*删除p结点的后继结点*/
bool DeleteNextDNode(DNode* *p) {
    if (p == NULL)
        return false;
    DNode* q = (*p)->next;                  //找到p的后继结点q
    if (q == NULL)
        return false;                       //p没有后继
    (*p)->next = q->next;
    if (q->next != NULL)                    //q结点不是最后一个结点
        q->next->prior = (*p);
    free(q);
    return true;
}

/*销毁双链表*/
void DestoryList(DLinklist* L) {
    while ((*L)->next != NULL)
        DeleteNextDNode(&(*L));
    free(*L);                               //释放头结点
    (*L) = NULL;                            //头指针指向NULL
}

void main() {
    DLinklist L,S,P;
    InitDLinkList(&L);
    InitDLinkList(&S);
    InitDLinkList(&P);

    L->data = 11;
    S->data = 12;
    P->data = 13;
    InsertNextDNode(&L, &S);
    InsertNextDNode(&L->next, &P);

    DeleteNextDNode(&L);
    DestoryList(&L);
}

问题记录:在VS2022中同一个解决方案中放置两个项目,如何对单个项目进行单独调试?

设置启动项单独运行项目:选中项目,右键,找到“设置为启动项”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值