王道数据结构实践代码----循环单链表的实现(C语言版)
前言
日期:2021年8月30日
书籍:王道2021年数据结构考研复习指导
代码内容:实现循环单链表的实现,包括初始化,插入新元素,删除新元素,输出,查询
代码展示
1.预编译内容
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//设置bool
#define bool char
#define true 1
#define false 0
//定义顺序表的数据Elemtype
typedef int Elemtype;
/*定义结点和链表的数据结构*/
//【1】循环单链表的结点结构
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node,*PNode;
//【2】循环单链表的链表结构
typedef struct CLinkList
{
PNode head;//指向头节点
PNode tail;//指向尾结点
int length;
}CLinkList;
2.循环单链表的初始化
/*循环单链表的初始化*/
bool CLinkListInit(CLinkList *L)
{
//[1]申请头结点
PNode HeadNode = (PNode)malloc(sizeof(Node));
//[2]判错
assert(HeadNode);
//[3]然单链表结构体和头结点结构体相连
L->head = L->tail = HeadNode;
L->length = 0;
//[4]让头节点的next指针指向头指针
HeadNode->next = L->head;
}
3.创建新节点
/*创建新节点*/
PNode CreatNode(Elemtype e)
{
//[1]申请新节点的空间
PNode newNode = (PNode)malloc(sizeof(Node));
//[2]为新节点赋值
newNode->data = e;
newNode->next = NULL;
}
4.定位(按位序定位,按内容定位)
/*定位*/
//【1】按位序定位
PNode GetElem(CLinkList *L,int i)
{
//[1]判断要定位的结点是否合法或特殊
assert(L);//检查L链表是否存在
if(i == 0) return L->head;//返回头指针的情况,用于按位删除或者插入时使用
if(L->length < i || i < 1) return NULL;//检查输入的节点位序是否存在
//[2]生成定位指针
PNode p = L->head->next;
//[3]循环定位
while (i > 1)
{
p = p->next;
i--;
}
//[4]返回p
return p;
}
//【2】按内容值定位
PNode LocateElem(CLinkList *L,Elemtype e)
{
//[1]判错
assert(L);//检查L链表是否存在
//[2]生成定位指针
PNode p = L->head->next;
//[3]循环定位
for (int i = 1; i < L->length; i++)
{
if(p->data == e) return p;
p = p->next;
}
return NULL;
}
5.王道书上的判空方式
/*王道书上的判空方式*/
//按照头结点的指针是否指向头指针为判空条件
bool IfEmpty(CLinkList *L)
{
return (L->head->next == L->head);
}
6.插入新节点(头插法,尾插法,按位序插入)
/*插入新节点*/
//【1】头插法
bool CLinListHeadInsert