前言
- 本节主要进行C语言数据结构单循环链表的学习。
1.单循环链表概述
- 单循环链头尾相接,形成一个环(即尾节点的后继指针指向第一个节点)。
- 其他的单链表的差别不大,但循环链表从表中任意一个节点出发,都可以访问其他的所有节点,无论前后,这也是单链表不具备的优势。
2.单循环链表实现
- 实现内容与单链表相同,1.初始化;2.增加节点:头插法、尾插法;3.删除节点;4.遍历节点。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
// <stdlib.h>是C语言中的一个头文件,该文件包含了的C语言标准库函数的定义。
// 1、意思是标准输入输出头文件。
// 2、用到标准输入输出函数时,就要调用这个头文件。
// 3、stdlib.h中,包含了C语言的一些常用且方便的库函数。
// 4、如动态内存相关的malloc,realloc,zalloc,calloc,free等。
// <stdbool.h>是C标准函数库中一个常用的头文件。它定义了一个布尔类型,于C99中加入。
typedef struct Node//定义数据结构,包含数据域域next域
{
int data;//data域
struct Node* next;//指针域,指向了同样类型的下一个
}Node;
Node* initList()//初始化头节点
{
Node* list=(Node*)malloc(sizeof(Node));//开辟空间,新建节点
list->data=0;//链表默认个数为0
list->next=list;//链表为空,故头节点循环指向自己
return list;
}
void headInsert(Node* list,int data)//头插法
{
Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
node->data = data;//data给到新建节点的数据域
node->next = list->next;//新建节点的next指向的是原先链表的第一个节点,也就是头节点指向的节点
list->next = node;//头节点指向新建节点
list->data++;//插入后链表元素加一
}
void tailInsert(Node* list,int data)//尾插法
{
Node* head=list;//保存头节点的地址
Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
node->data = data;//data给到新建节点的数据域
node->next = list;//新建节点指向list
while(list->next!=head)//寻找最后一个节点
{
list=list->next;
}
list->next=node;//最后一个节点指向新建节点
head->data++;//头节点里的data域节点数加一
}
bool delete(Node* list,int data)//删除
{
Node* head=list;//保存头节点的地址
Node* pre=list;//保存头节点,它是current的前一个节点
Node* current=list->next;//保存第一个节点开始,从它开始遍历
while(current!=head)//遍历,可使用头节点data进行for循环遍历
{
if(current->data==data)//找到data
{
pre->next=current->next;//将前一个节点指向要要删除节点的下一个节点
free(current);//释放要铲除节点的堆内存空间
break;//退出循环
}
pre = current;//未找到data则往后继续遍历
current = current->next;//未找到data则往后继续遍历
}
if(current!=head)
{
list->data--;
return true;
}
else return false;
}
void printList(Node* list)//遍历操作
{
Node* node=list->next;//循环链表的第一个节点给到新建节点node,即头节点的下一个
while(node!=list)
{
printf("%d",node->data);
node=node->next;
}
printf("\n");
}
int main()
{
Node* list= initList();//初始化头节点,创捷链表节点
headInsert(list,5);
headInsert(list,4);
headInsert(list,3);
headInsert(list,2);
headInsert(list,1);
tailInsert(list,6);
tailInsert(list,7);
tailInsert(list,8);
tailInsert(list,9);
tailInsert(list,10);
printList(list);
printf("%d\n",delete(list,1));
printf("%d\n",delete(list,11));
printf("%d\n",delete(list,6));
printf("%d\n",delete(list,6));
printf("%d\n",delete(list,10));
printList(list);
system("pause");
}
参考资料:
链接1: UP从0到1带你手撕数据结构全集(C语言版)
链接2: 【C语言数据结构】1.单链表