循环单链表
循环单链表的特点是最后一个节点的指针不是指向NULL,而是指向头节点,形成一个环。这样做的优点是从任何一个节点出发都能访问到整个链表。
主要特点:
- 有一个头节点,头节点的数据域可以不存储任何信息,也可以存储如链表长度等附加信息。
- 最后一个节点的
next
指针指向头节点,形成一个环。 - 在进行插入和删除操作时,需要特别小心地处理指针,以确保环不被破坏。
循环双链表
循环双链表是每个节点有两个指针,一个指向前一个节点(prior
),一个指向下一个节点(next
)。循环双链表的最后一个节点的next
指向头节点,而头节点的prior
指向最后一个节点。
主要特点:
- 每个节点都有一个前驱指针和一个后继指针。
- 头节点的
prior
指向最后一个节点,最后一个节点的next
指向头节点。 - 插入和删除操作时,需要同时修改两个方向的指针。
以下是代码展示
#include<stdio.h>
#include<stdlib.h>
//循环单链表结构体
typedef struct LNode{
int data; //定义单链表节点类型
struct LNode *next; //每个节点存放一个数据元素
} LNode,*LinkList; //指针指向下一个节点
//循环双链表结构体
typedef struct DNode{
int data;
struct DNode *prior, *next;
}DNode, *DLinklist;
//初始化一个循环单链表
bool InitList(LinkList &L){
L=(LNode *) malloc(sizeof(LNode)); //分配一个头节点
if(L==NULL) //内存不足,分配失败
return false;
L->next=L; //头节点next指向头节点
return true;
}
/*//判断循环单链表是否为空
bool Empty(LiinkList L){
if(L->next==L){
return true;
}else{
return false;
}
}
//判断节点p是否为循环单链表的表尾节点
bool isTail(LiinkList L,LNode *p){
if(p->next==L){
return true;
}else{
return false;
}
}
*/
// 初始化双链表
bool InitDLinkList(DLinklist &K){
K = (DNode *)malloc(sizeof(DNode)); // 分配一个节点
if(K == NULL){ // 内存不足,分配失败
return false;
}
K->prior = K; // 头节点的prior指向头节点
K->next = K; // 头节点的next指向头节点
return true;
}
/*//判断循环双链表是否为空
bool Empty(LinkList K){
if(L->next==K){
return true;
}else{
return false;
}
}
*/
int main(){
// 初始化循环单链表
LinkList L;
InitList(L);
// 初始化循环双链表
DLinklist K;
InitDLinkList(K);
}