循环链表(循环单链表、循环双链表)的相关操作的代码实现(C语言)
发布日期:2021-05-04 14:30:54 浏览次数:43 分类:原创文章

本文共 1348 字,大约阅读时间需要 4 分钟。

一、循环链表

(一)循环单链表

  • 单链表和循环单链表的区别:
    在这里插入图片描述
typedef struct LNode{   	//定义单链表结点类型	ElemType data;		//定义节点存放一个数据元素	struct LNode *next;	//指针指向下一个节点}LNode, *LinkList;//初始化一个循环单链表bool InitList(LinkList &L){   	L = (LNode *)malloc(sizeof(LNode));	//分配一个头结点	if(L == NULL)		//内存不足,分配失败		return false;	L -> next = L;		//头结点next指向头结点	return true;}

在这里插入图片描述

//判断循环单链表是否为空bool Empty(LinkList L){   	if(L -> next == L)		return true;	else		return false;}

在这里插入图片描述

//判断结点p是否为循环单链表的表尾结点bool isTail(LinkList L, LNode *p){   	if(p -> next == L)		return true;	else		return false;}

在这里插入图片描述

(二)循环双链表

在这里插入图片描述

1. 循环双链表的初始化

  • 初始化空的循环双链表
typedef struct DNode{   	ElemType data;	struct DNode *prior,*next;}DNode, *DLinklist;//初始化空的循环双链表bool InitDLinkList(DLinklist &L){   	L = (DNode *) malloc(sizeof(DNode));	//分配一个头结点	if(L==NULL)		//内存不足,分配失败		return false;	L -> prior = L;	//头结点的prior指向头结点	L -> next = L;	//头结点的next指向头节点	return true;}void testDLinklist(){   	//初始化循环双链表	DLinklist L;	InitDLinkList(L);	///..后续代码..}
  • 判断循环双链表是否为空
    在这里插入图片描述
bool Empty(DLInklist L){   	if(L -> next == L)//👈是否指向链表自身		return true;	else		return false;}

2. 双链表的插入

在这里插入图片描述

//在p结点之后插入s结点bool InsertNextDNode(DNode *p, DNode *s){   	s -> next = p -> next;	//将结点*s插入到结点*pzhiho	p -> next -> prior = s;	//👈,在双链表中出现错误;但是在循环双链表中不会出现错误	s -> prior = p;	p -> next = s;}

3. 双链表的删除

在这里插入图片描述

//删除p的后继结点qp -> next = q -> next;q -> next -> prior = p;//👈,在双链表中出现错误;但是在循环双链表中不会出现错误free(q);
上一篇:静态链表的基本操作的实现(C语言)
下一篇:双链表初始化、插入、删除、遍历等操作的分析(C语言)

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月30日 14时07分28秒