通过C语言实现循环单链表和循环双链表的基本操作和链表的基本操作类似。其中,循环链表的表尾指向表头,而循环双链表的表头指向表尾。
循环单链表的创建、初始化、判空与表尾结点判断的代码实现如下:
#include <stdio.h>
#include <stdbool.h>
/*定义循环单链表*/
typedef struct LNode { //定义单链表结点类型
int 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 ture;
}
/*判空*/
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;
}
循环双链表的创建、初始化、判空与插入的代码实现如下:
#include <stdio.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 = L; //头结点的prior指向头结点
(*L)->next = L; //头结点的next指向头结点
return true;
}
/*判空*/
bool Empty(DLinklist* L) {
if ((*L)->next == L)
return true;
else
return false;
}
/*判断结点p是否为循环双链表的表尾结点*/
bool isTail(DLinklist *L, DNode* p) {
if (p->next == L)
return true;
else
return false;
}
/*在p结点后插入s结点*/
bool InsertNextDNode(DNode* *p, DNode* *s) {
(*s)->next = (*p)->next;
(*p)->next->prior = s;
(*s)->prior = p;
(*p)->next = s;
}