循环单链表(带头节点)
单链表的节点类型描述如下:
typedef struct LNode {//定义单链表节点类型
int data;//数据域
struct LNode* next;//指针域
}LNode,*LinkList;
循环单链表的基本操作实现:(其他的插入,删除操作类似于单链表)
bool InitList(LinkList& L) {//初始化一个循环单链表
bool Empty(LinkList L) {//判断链表是否为空
bool isTail(LinkList L, LNode* p) {//判断节点p是否为循环单链表的表尾节点
具体操作实现:
bool InitList(LinkList& L) {//初始化一个循环单链表
L = (LNode*)malloc(sizeof(LNode*));//分配一个头节点
if (L == NULL) {//内存不足,分配失败
return false;
}
L->next = L;
return true;
}
bool Empty(LinkList L) {
if (L->next == L) {//表示头节点的下一个节点还是头节点
return true;
}
return false;
}
bool isTail(LinkList L, LNode* p) {//判断节点p是否为循环单链表的表尾节点
if (p == NULL) {
return false;
}
else {
if (p->next == L) {
return true;
}
return false;
}
}
循环双链表带头节点
双链表的节点类型描述如下:
typedef struct DNode {//定义双链表节点类型
int data;//数据域
struct DNode*prior,*next;//前驱和后继指针
}DNode,*DLinkList;
循环双链表的基本操作实现:
bool InitDList(DLinkList& L) {//初始化一个循环双链表
bool Empty(DLinkList L) {//判断循环双链表是否为空
bool isTail(DLinkList L, DNode* p) {//判断节点p是否为循环双链表的表尾节点
bool InsertNextDNode(DNode* p, DNode* s) {//在p节点之后插入s节点
bool DeleteDNode(DNode* p, DNode* q) {//删除p节点的后继节点q
循环双链表的以上函数的具体操作实现:
bool InitDList(DLinkList& L) {//初始化一个循环双链表
L = (DNode*)malloc(sizeof(DNode*));//分配一个头节点
if (L == NULL) {//内存不足,分配失败
return false;
}
L->next = L;
L->prior = L;
return true;
}
bool Empty(DLinkList L) {
if (L->next == L) {//表示头节点的下一个节点还是头节点
return true;
}
return false;
}
bool isTail(DLinkList L, DNode* p) {//判断节点p是否为循环双链表的表尾节点
if (p == NULL) {
return false;
}
else {
if (p->next == L) {
return true;
}
return false;
}
}
bool InsertNextDNode(DNode* p, DNode* s) {//在p节点之后插入s节点
if (p == NULL||s==NULL) {
return false;
}
s->next = p->next;
p->next->prior = s;
p->next = s;
s->prior = p;
}
bool DeleteDNode(DNode* p, DNode* q) {//删除p节点的后继节点q
p->next = q->next;
q->next->prior = p;
free(q);
}