c语言实现--单向循环链表操作
1,什么叫单向循环链表。单向循环链表是指在单链表的基础上,表的最后一个元素指向链表头结点,不再是为空。
2,由图可知,单向循环链表的判断条件不再是表为空了,而变成了是否到表头。
3,链表的结点表示
1 struct LNode
2 {
3 int data;
4 struct LNode * next;
5 };
6 typedef struct LNode * linklist
4,单向循环链表的操作集合,仍是defs.h里的操作集合,这里就不给出了。
5,单循环链表的初始化操作。示意图
实现:
1 #include"defs.h"
2
3 void InitList(linklist *L) //改变尾指针
4 {
5 *L = (linklist)malloc(sizeof(struct LNode)); //分配头结点
6 if (*L == NULL) //分配失败
7 exit(0);
8 (*L)->next = *L; //指针域指向它本身
9 }
6,清空操作最終图和初始化的结果是一样的。
1 #include"defs.h"
2
3 void ClearList(linklist *L) //改变尾指针
4 {
5 linklist p, q;
6 *L = (*L)->next; //先令尾指针指向头结点,不然释放最后一个结点时尾指针,无法指向头结点
7 p = (*L)->next; //p指向第一个结点
8
9 while (p != *L) //p未到表头时
10 {
11 q = p->next;
12 free(p);
13 p = q;
14 }
15 *L->next = *L; //头结点指针域指向其本身
16 }
7,DestroyList操作。撤销操作是在清空操作基础上,释放了头结点。
1 #include"defs.h"
2
3 void DestroyList(linklist *L)
4 {
5 ClearList(&L);
6 free(*L); //释放头结点
7 *L = NULL;
8 }
DestroyList.c
8,ListEmpty操作。
1 #include"defs.h"
2
3 int ListEmpty(linklist L)
4 {
5 if (L->next == L) //指针域指向它本身,肯定就是空了,该结点即为头结点
6 return 0;
7 else
8 return 1; //非空为1
9 }
ListEmpty.c
9,ListLength操作
1 #include"defs.h"
2
3 int ListLength(linklist L)
4 {
5 linklist p = L->next->next; //p指向第一个结点
6 int j = 0;
7
8 while (p != L->next) //p未到表头时
9 {
10 ++j;
11 p = p->next;
12 }
13 return j;
14 }
ListLength.c
10,GetElem操作
1 #include"defs.h"
2
3 void GetElem(linklist L, int i, int *e)
4 {
5 linklist p = L->next ; //p指向头结点
6 int j = 0;
7 if (i<1 || i>ListLength(L)) //位置不合理
8 exit(0);
9
10 while (j < i) //位置合理,找到第i个结点
11 {
12 ++j;
13 p = p->next;
14 }
15 *e = p->data;
16 }
GetElem.c
11,LocateElem操作
1 #include"defs.h"
2
3 int LocateElem(linklist L, int e)
4 {
5 linklist p = L->next->next; //p指向链表第一个元素
6 int j = 0;
7
8 while (p != L->next) //p未到表头时
9 {
10 ++j;
11 if (p->data == e)
12 return j;
13 p = p->next;
14 }
15 return -1; //未找到,返回-1
16 }
LocateElem.c
12,PriorElem操作实现
1 #include"defs.h"
2
3 int PriorElem(linklist L, int cur_e, int *pri_e)
4 {
5 linklist p = L->next->next; //p指向链表第一个元素
6 linklist q;
7
8 while (p != L->next)
9 {
10 q = p->next; //q指向p的后继
11 if (q != L->next && q->data == cur_e)
12 {
13 *pri_e = p->data;
14 return 0;
15 }
16 p = q;
17 }
18 return 0;
19 }
PriorElem.c
13,NextElem操作实现
1 #include"defs.h"
2
3 int NextElem(linklist L, int cur_e, int *Nex_e) //最后一个元素无后继
4 {
5 linklist p = L->next->next; //p指向第一个结点
6 linklist q;
7
8 while (p != L->next)
9 {
10 q = p->next;
11 if (q != L->next && p->data == cur_e)
12 {
13 *Nex_e = q->data;
14 return 0;
15 }
16 p = q;
17 }
18 return 0;
19 }
NextElem.c
14,ListInsert操作实现
1 #include"defs.h"
2
3 int ListInsert(Linklist *L, int i, int e) //在表尾插入改变尾指针
4 {
5 linklist p = (*L)->next; //p指向表头
6 linklist q, s;
7 int j = 0;
8
9 if (i<1 || i>ListLength(L)+1) //插入位置不合理
10 exit(0);
11
12 while (j < i-1) //位置合理,找到第i-1个结点
13 {
14 ++j;
15 p = p->next;
16 }
17 q = p->next; //q指向第i个结点
18 s = (linklist)malloc(sizeof(struct LNode));
19 s->data = e;
20 s->next = q;
21 q->next = s;
22 if (p == *L)
23 *L = s;
24 }
15,ListDelete操作实现
1 #include"defs.h"
2
3 int ListDelete(linklist *L, int i, int *e)
4 {
5 linklist p = (*L)->next;
6 linklist q;
7 int j = 0;
8 if (i<1 || i>ListLength(L))
9 exit(0);
10
11 while (j<i-1) //找到第i-1个结点
12 {
13 ++j;
14 p = p->next;
15 }
16 q = p->next; //q指向第i个结点
17 *e = q->data;
18 p->next = q->next;
19 if (q == *L) //删除的是表尾元素,表尾指针发生改变
20 *L = p;
21 free(q);
22 return 0;
23 }
16,TravelList操作实现
1 #include"defs.h"
2
3 void TravelList(linklist L)
4 {
5 linklist p = L->next->next; //p指向第一个结点
6 int j = 0;
7
8 while (p != L->next) //p未到表头
9 {
10 ++j;
11 printf("第%d个元素为:%d\n", j, p->data);
12 p = p->next;
13 }
14 }
TravelList.c
c语言实现--单向循环链表操作的更多相关文章
- C语言通用双向循环链表操作函数集
说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低. 可基于该函数集方便地构造栈或队列集. 本函数集暂未考虑并发保护. 一 ...
- c语言实现--双向循环链表操作
1,双向链表相当于两个单向循环链表. 2,双向链表的结点定义. 1 struct DULNode 2 { 3 int data; 4 struct DULNode * prior; 5 struct ...
- C/C++实现单向循环链表(尾指针,带头尾节点)
C语言实现单向循环链表,主要功能为空链表创建,链表初始化(头插法,尾插法),链表元素读取,按位置插入,(有序链表)按值插入,按位置删除,按值删除,清空链表,销毁链表. 单向循环链表和单向链表的区别:( ...
- 单向循环链表C语言实现
我们都知道,单向链表最后指向为NULL,也就是为空,那单向循环链表就是不指向为NULL了,指向头节点,所以下面这个程序运行结果就是,你将会看到遍历链表的时候就是一个死循环,因为它不指向为NULL,也是 ...
- 复习下C 链表操作(单向循环链表、查找循环节点)
循环链表 稍复杂点. 肯能会有0 或 6 字型的单向循环链表. 接下来创建 单向循环链表 并 查找单向循环链表中的循环节点. 这里已6字型单向循环链表为例. //创建 循环链表 Student * ...
- 基于visual Studio2013解决算法导论之021单向循环链表
题目 单向循环链表的操作 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...
- Python 单向循环链表
操作 is_empty() 判断链表是否为空 length() 返回链表的长度 travel() 遍历 add(item) 在头部添加一个节点 append(item) 在尾部添加一个节点 inser ...
- python中的单向循环链表实现
引子 所谓单向循环链表,不过是在单向链表的基础上,如响尾蛇般将其首尾相连,也因此有诸多类似之处与务必留心之点.尤其是可能涉及到头尾节点的操作,不可疏忽. 对于诸多操所必须的遍历,这时的条件是什么?又应 ...
- 数据结构与算法-python描述-单向循环链表
# coding:utf-8 # 单向循环链表的相关操作: # is_empty() 判断链表是否为空 # length() 返回链表的长度 # travel() 遍历 # add(item) 在头部 ...
随机推荐
- 使用 C# 9 的records作为强类型ID - 初次使用
强类型ID 实体通常是整数,GUID或者string类型,因为数据库直接支持这些类型,但是,如果实体的ID的类型是一样的,比如都是整数的ID,这有可能会出现ID值传错的问题,看下边的示例. publi ...
- qmake奇淫技巧之字符串宏定义
阅读本文大概需要3.3分钟 我们平时在软件开发过程中需要定义一些宏,以便在代码中调用,这样每次不需要修改代码,只需要修改外部编译命令就可以得到想要的参数,非常方便 比如我们想在软件介绍中显示软件版本, ...
- 【RAC】打完补丁后,发现只有一台rac可以启动,另一台无法启动
安装11Gr2单机asm后,打完11.2.0.3.7的psu后,发现启动不起来数据库,alert日志内容如下: Errors in file /u01/app/oracle/diag/rdbms/bd ...
- C#中foreach的实现原理
C#中foreach的实现原理 在探讨foreach如何内部如何实现这个问题之前,我们需要理解两个C#里边的接口,IEnumerable 与 IEnumerator. 在C#里边的遍历集合时用到的相关 ...
- oracle 释放表空间到OS(resize)
1.查看表空间里面的对象 SELECT OWNER AS OWNER, SEGMENT_NAME AS SEGMENT_NAME, SEGMENT_TYPE AS SEGMENT_TYPE, SUM ...
- 命令模式与go-redis command设计
目录 一.什么是命令(Command)模式 二.go-redis command相关代码 三.总结 一.什么是命令(Command)模式 命令模式是行为型设计模式的一种,其目的是将一个请求封装为一个对 ...
- Core3.1 微信v3 JSAPI支付
1.前言 "小魏呀,这个微信支付还要多久?","快了快了老板,就等着最后一步了...","搞快点哈,就等着上线呢","...... ...
- vue3.0改变概况
一.slot API在render实现原理上的变化 二.全局API使用规范变化 三.Teleport添加 四.composition API变化 五.v-model变化
- 【Soul网关探秘】http数据同步-Admin通知前处理
引言 本篇开始研究 Soul 网关 http 数据同步,将分为三篇进行分析: <Admin通知前处理> <变更通知机制> <Bootstrap处理变更通知> 希望三 ...
- Maven 本地仓库
概述 Maven 的本地资源库是用来存储所有项目的依赖关系(插件 Jar 和其他文件,这些文件被 Maven 下载)到本地文件夹.很简单,当你建立一个 Maven 项目,所有相关文件将被存储在你的 M ...