欢迎光临散文网 会员登陆 & 注册

《数据结构(C语言版)》循环链表的实现

2022-03-26 19:50 作者:回到唐朝当少爷  | 我要投稿

清华大学计算机系列教材   累计发行超400万册

严蔚敏 吴伟明 编著

数据结构(C语言版)

以下是本人对该紫皮书第二章线性表中循环链表的代码实现, 由于课本惜墨如金,连一行代码都没有给,就只用文字提到了循环链表的合并操作,因此本人仅对该操作进行了代码实现,时间复杂度为O(1),循环链表的完整数据结构与动态单链表类似

(貌似专栏把我缩进吃了,懒得加了,另外建议用visual studio编译)

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int ElemType;

typedef int Status;

typedef struct LNode

{

ElemType data;

struct LNode* next;

}LNode, * CircularList;

/*

单链表的循环条件与循环链表的循环条件的异同:

 单链表   ->   循环链表

p!=NULL ->    p!=L

p->next!=NULL    ->     p->next!=L

循环链表常常加入尾指针R

a1的存储位置为R->next->next

an的存储位置为R

*/

/*由于书上仅设立尾指针而不设立头指针,故用返回尾指针的方式建立链表*/

CircularList CreatList_CL_R(int n);//尾插法建立循环链表

void ShowList_CL(CircularList rear);//打印循环链表

CircularList MergeList_CL(CircularList rear1, CircularList rear2);//循环链表的合并

int main()

{

int n = 0;

printf("请输入你想要创建的循环链表A的元素个数:");

scanf("%d", &n);

CircularList rear1 = CreatList_CL_R(n);

printf("请输入你想要创建的循环链表B的元素个数:");

scanf("%d", &n);

CircularList rear2 = CreatList_CL_R(n);

printf("循环链表A:");

ShowList_CL(rear1);

printf("循环链表B:");

ShowList_CL(rear2);

CircularList rear = MergeList_CL(rear1, rear2);//将循环链表B接在循环链表A的后面

printf("合并后的循环链表:");

ShowList_CL(rear);

return 0;

}

CircularList CreatList_CL_R(int n)//尾插法建立循环链表

{

CircularList head = (CircularList)malloc(sizeof(LNode));

if (!head)

{

exit(OVERFLOW);

}

head->data = 0;

head->next = head;

CircularList rear = head;

int num = 0;

printf("请输入该循环链表中的元素:");

for (int i = 0; i < n; i++)

{

scanf("%d", &num);

LNode* pNew = (CircularList)malloc(sizeof(LNode));

if (!pNew)

{

exit(OVERFLOW);

}

pNew->data = num;

pNew->next = head;

rear->next = pNew;

rear = pNew;

}

return rear;

}

void ShowList_CL(CircularList rear)//打印循环链表

{

CircularList head = rear->next;

CircularList p = rear->next->next;

while (p != head)

{

printf("%d ", p->data);

p = p->next;

}

printf("\n");

}

CircularList MergeList_CL(CircularList rear1, CircularList rear2)//循环链表的合并

{

CircularList head1 = rear1->next;//head1存循环链表A的表头节点

rear1->next = rear2->next->next;//循环链表B的表头连接A的表尾

free(rear2->next);//释放循环链表B的表头节点

rear2->next = head1;//修改循环链表B的尾指针

return rear2;

}


《数据结构(C语言版)》循环链表的实现的评论 (共 条)

分享到微博请遵守国家法律