第二节 单循环链表
- 与单链表类似,但是循环链表的结尾指向链表的头部。
初始化链表
需要引用头文件
stdio.h
、stdlib.h
.
//定义链表结构体
typedef struct Node{
int data;
struct Node* next;
}Node;
//初始化循环链表
Node* initList(){
Node* L = (Node*)malloc(sizeof(Node));//开辟空间
L ->data = 0;
L ->next = L;
return L;
}
- 链表的插入方法
//头插法
void headInsert(Node* L , int data){
Node* node = (Node*)malloc(sizeof(Node));//开辟空间
node ->data = data;
L ->data++;
node ->next = L ->next;//指向链表头
L ->next = node;//改变链表首地址位置,使之指向新插入的节点
}
//尾插法
void tailInsert(Node* L , int data){
Node* current = L ->next;
Node* node = (Node*)malloc(sizeof(Node));//开辟空间
node ->data = data;
L ->data++;
while(current ->next != L){
current = current->next;
}
current ->next = node;
node ->next = L;
}
链表的删除
目前对于链表的删除算法还是不够完善,只能完成对于链表中指令数据的删除,删除成功后会有对应的
//链表的删除
void deleat(Node* L ,int data){
Node* pre = L;//要删除节点之前的节点
Node* current = L -> next;//要删除节点所指向的节点
while(current != L){
if(current -> data == data){//遍历找到想要删除的节点,并完成删除
pre -> next = current -> next;
free(current);//释放删除节点的空间
L ->data--;
printf("Deleat Successfully!\n");
break;
}
pre = current;
current = current -> next;
}
}
- 链表的打印
//链表的输出
void printList(Node* L){
Node* node = L ->next;
while(node != L){
printf("%d->",node ->data);
node = node ->next;
}
printf("END\n");
}
至此,单循环链表的基本函数已经完成了编写,接下来在主函数进行调用,运行看看吧。
主函数
int main()
{
Node* L = initList();
headInsert(L,1);
headInsert(L,2);
headInsert(L,3);
tailInsert(L,1);
tailInsert(L,2);
tailInsert(L,3);
printList(L);
deleat(L,1);
printList(L);
}
输出结果:
3->2->1->1->2->3->END
Deleat Successfully!
3->2->1->2->3->END