王道数据结构实践代码----双链表的实现(C语言版)

本文是根据王道2021年数据结构考研复习指导,详细介绍了如何用C语言实现双链表,包括结构体定义、初始化、插入、遍历和删除操作,并给出了运行效果图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

王道数据结构实践代码----双链表的实现(C语言版)

前言

日期:2021年8月28日
书籍:王道2021年数据结构考研复习指导
代码内容:实现双链表的实现,包括初始化,插入新元素,删除新元素,输出,查询

代码难点

1.双链表插入、删除的操作

在这里插入图片描述
上图操作的语句顺序不是唯一的,但也不是任意的,①和②两步必须在④步之前,否则p的后继结点的指针就会丢掉,导致插入失败。
为了加深理解,读者可以在纸上画出示意图。
若问题改成要求在结点
p之前插入结点s,请读者思考具体的操作步骤。
在这里插入图片描述
此处①②无顺序要求
若问题改成要求删除结点
q的前驱结点*p,请读者思考具体的操作步骤。

代码展示

双链表结构体定义

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

//C语言自定义bool操作
#define bool char
#define false 0
#define true 1

/*数据元素类型*/
typedef int ElemType;

/*双链表结构体定义*/
typedef struct DNode        //定双链表结点类型
{
   
   
    ElemType data;          //每个结点存放一个数据元素
    struct DNode *next;     //指针指向下一节点
    struct DNode *prior;    //指针指向上一节点
}DNode,*DLinkList;

双链表初始化函数

/*双链表初始化函数*/
DLinkList DLinkListInit()
{
   
   
    //[1]申请空间
    DLinkList L = (DLinkList)malloc(sizeof(DLinkList));
    //[2]安排指针
    L->next = NULL;
    L->prior = NULL;
    //[3]返回头节点
    return L;
}

双链表的插入操作

/*双链表的插入操作*/
//【1】双链表新节点的创建,返回新节点指针
DNode* CreateNewDNode(ElemType data)
{
   
   
    //[1]为新节点分配空间,并判断是否分配成功
    DNode* newNode = (DNode*)malloc(sizeof(DNode));
    if(!newNode)
    {
   
   
        printf("分配空间失败,请检查内存!\n");
        return NULL;
    }
    //[2]初始化新节点
    newNode->data = data;
    newNode->next = NULL;
    newNode->prior = NULL;
    //[3]返回节点地址
    return newNode;
}
//【2】双链表节点定位----按位序号查询,返回需要查找的节点的指针
DNode* GetElem(DLinkList L, int i)
{
   
   
    //[1]判空
    if(L->next == NULL) {
   
   printf("这是空表!"); return L;}
    //[2]生成指向目标节点的指针p
    DNode* p = L->next;
    //[3]如果i = 0
    if(i < 1)
    {
   
   
        p = L;
        return p;
    }
    //[4]开始循环定位
    while (p->next != NULL && i != 1)
    {
   
   
        p = p->next;
        i--;
    }
    //[5]返回节点
    if(i != 1)
    printf("没有这个节点,返回链表的最后一位.\n");
    return p;
}
//【3】双链表节点定位----按内容值查询,返回需要查找的节点的指针
DNode* LocateElem(DLinkList L,ElemType e)
{
   
   
    //[1]判空
    if(L->next == NULL) {
   
   printf("这是空表!"); return L;}
    //[2]生成指向目标节点的指针p
    DNode* p = L->nex
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值