王道数据结构实践代码----双链表的实现(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