版权声明:Sock的blog, 可以偷看但不可以偷走哦 https://blog.csdn.net/qq_42957923/article/details/84970670
循环单链表的简单操作
因为循环单链表和单链表的插入,删除等操作大同小异 ,因此我只总结了循环链表的创建,遍历以及销毁操作
循环链表的定义
//定义一个单链表
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *LinkList;
虚幻链表的创建
//创建一个指定大小的循环链表
void CreateLoopList(LinkList* L, int n) {
if (n < 1) {
printf("输入有误\n");
return;
}
printf("请输入 %d 个数据:", n);
//创建头结点
*L = (LinkList)malloc(sizeof(LNode));
if (!(*L)) {
exit(0);
}
LinkList rear = *L;
LinkList p = NULL;
for (int i = 0; i < n; ++i) {
p = (LinkList)malloc(sizeof(LNode));
if (!p) {
exit(0);
}
scanf("%d", &p->data);
rear->next = p;
rear = p;
}
//尾指针连到头结点
rear->next = *L;
}
循环链表的遍历
//遍历循环链表
void Traverse(LinkList L) {
LinkList adjust = L->next;
while (adjust != L) {
printf("%d ", adjust->data);
adjust = adjust->next;
}
printf("\n");
}
循环链表的销毁
//销毁循环链表
void Destroy(LinkList* L) {
//将循环链表变成单链表
LinkList adjust = (*L)->next;
(*L)->next = NULL;
*L = adjust;
while (*L != NULL) {
adjust = adjust->next;
free(*L);
*L = adjust;
}
}
测试
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
//定义一个单链表
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *LinkList;
//创建一个指定大小的循环链表
void CreateLoopList(LinkList* L, int n) {
if (n < 1) {
printf("输入有误\n");
return;
}
printf("请输入 %d 个数据:", n);
//创建头结点
*L = (LinkList)malloc(sizeof(LNode));
if (!(*L)) {
exit(0);
}
LinkList rear = *L;
LinkList p = NULL;
for (int i = 0; i < n; ++i) {
p = (LinkList)malloc(sizeof(LNode));
if (!p) {
exit(0);
}
scanf("%d", &p->data);
rear->next = p;
rear = p;
}
rear->next = *L;
}
//遍历循环链表
void Traverse(LinkList L) {
LinkList adjust = L->next;
while (adjust != L) {
printf("%d ", adjust->data);
adjust = adjust->next;
}
printf("\n");
}
//销毁循环链表
void Destroy(LinkList* L) {
//将循环链表变成单链表
LinkList adjust = (*L)->next;
(*L)->next = NULL;
*L = adjust;
while (*L != NULL) {
adjust = adjust->next;
free(*L);
*L = adjust;
}
}
int main() {
LinkList L1;
CreateLoopList(&L1, 5);
Traverse(L1);
Destroy(&L1);
if (!L1) {
printf("OK\n");
}
system("pause");
return 0;
}
欢迎大家的评论