线性表-循环单链表
循环链表是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环,从表中任何一结点出发均可找到表中其他结点
循环链表的操作和线性链表基本一致,差别仅在于算法中的循环条件不是p或p->next是否为空,而是在于它们是否等于头指针。
文章图片
image.png 0、定义
#include
#include
#include
#include typedef int ElemType ;
struct Node{
ElemType data;
//数据域
struct Node *next;
//节点
};
typedef Node CircleList;
1、初始化链表
/**
* 功能:初始化链表
*/
void Init_List(CircleList* head){
head->next=head;
}
2、判断是否为空链表
/**
* 功能:判断链表是否是空表
* 参数:链表头指针
* 返回值:true 是false 否
*/
bool IsEmpty(CircleList *head){
if(head->next==head){
printf("CircleList为空表\n");
return true;
}
return false;
}
3、获取链表长度
/**
* 功能:获取链表长度
* 参数:链表地址
* 返回值:链表长度
*/
int Length_List(CircleList *head){
CircleList* p=head->next;
int length=0;
while(p!=head){
p=p->next;
length++;
}
return length;
}
4、展示链表
/**
* 功能:遍历链表
* 参数:链表地址
*/
void Show_List(CircleList *head){
if(head==NULL){
printf("链表未初始化\n");
return ;
}
if(head->next==head){
printf("[]\n");
return;
}
bool flag=true;
printf("[");
CircleList *p=head->next;
//第一个节点
while(p!=head){
if(flag){
printf("%d",p->data);
flag=false;
}else{
printf(",%d",p->data);
}
p=p->next;
}
printf("]\n");
}
5、插入操作
/**
* 功能:向链表插入数据元素
* 参数:链表地址 下标插入的元素
* 返回值:链表长度
*/
bool Insert_List(CircleList *head,int index, ElemType e){
if(head==NULL){
printf("链表未初始化\n");
return false;
}
if(index<1||index>Length_List(head)+1){
printf("下标越界\n");
return false;
}
//开始插入
int i;
CircleList* pre=head;
//遍历获取到插入位置的前一个元素
for(i=1;
inext!=head);
i++){
pre=pre->next;
}
//校验
if(!pre||i>index){
printf("搜索index位置元素失败\n");
//已判断下标越界,不会存在这个问题
return false;
}
CircleList* newNode=(CircleList*)malloc(sizeof(CircleList));
newNode->data=https://www.it610.com/article/e;
newNode->next=pre->next;
pre->next=newNode;
return true;
}
6、删除元素
/**
* 功能:删除某个下标的数据元素
* 参数:链表地址 下标删除的元素
* 返回值:链表长度
*/
bool Delete_List(CircleList *head,int index, ElemType *e){
if(head==NULL){
printf("链表未初始化\n");
return false;
}
if(index<1||index>Length_List(head)){
printf("下标越界\n");
return false;
}
CircleList *pre,*temp;
pre=head;
int i=1;
//遍历获取到删除的前一个元素
while(pre->next!=head && inext;
i++;
}
temp=pre->next;
*e=temp->data;
pre->next=temp->next;
free(temp);
return true;
}
【线性表-循环单链表】7、查找元素
/**
* 功能:查找元素,返回下标
* 参数:链表地址 元素
* 返回值: 下标 -1 为查找不到
*/
int Search_List(CircleList *head,ElemType e){
if(IsEmpty(head)){
return -1;
}
CircleList *p=head->next;
//第一个节点
int i=1;
while(p!=head){
if(p->data=https://www.it610.com/article/=e){
return i;
}
p=p->next;
i++;
}
return -1;
}
8、获取下标的元素
/**
* 功能:获取某个下标的元素
* 参数:链表地址 下标
* 返回值: true ,false
*/
bool GetElem(CircleList *head,int index,ElemType *e){
if(IsEmpty(head)){
return false;
}
if(index<1||index>Length_List(head)){
printf("数组下标越界\n");
return false;
}
CircleList *p=head->next;
//第一个节点
int j=1;
while((p!=head)&&jnext;
j++;
}
if((p==head)||j>index)return false;
*e=p->data;
return false;
}
9、清空链表
/**
* 功能:清空线性表
* 参数:pList:链表地址
*/
bool Clear_List(CircleList* head){
CircleList *temp,*p;
temp=head->next;
//第一个节点
while(temp != head){
p=temp->next;
free(temp);
temp=p;
}
head->next=head;
return true;
}
推荐阅读
- 急于表达——往往欲速则不达
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- leetcode|leetcode 92. 反转链表 II
- 下雪了,飞去你的城市拥抱你|下雪了,飞去你的城市拥抱你 | 有个直男向我表白了
- 2019女表什么牌子好(如何挑选女士手表?)
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 佳琪(三十一)
- 霍兰德职业代码对照表
- 戏曲表演对幼儿的好处。