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) 在头部 ...
随机推荐
- 深入理解static、volatile关键字
static 意思是静态的,全局的.被修饰的东西在一定范围内是共享的,被类的所有实例共享,这时候需要注意并发读写的问题. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们. ...
- wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序
环境Win10 VS2019 .Net Framework4.8 在wpf中,如果为一个DataGrid绑定到一个数据源,默认情况下DataGrid会为数据源类型的每个属性生成一个列(Column)对 ...
- IDEA 常用的一些 (就几个) 快捷键
快捷键 说明 Ctrl + P 提示类参数 Ctrl + Q 提示类的属性和方法包名 Ctrl + D 复制一行到下一行 Ctrl + F 查找 Ctrl + R 替换 Ctrl + Z 撤销 Ctr ...
- 【Linux】ssh设置了密钥,但ssh登陆的时候还需要输入密码
------------------------------------------------------------------------------------------------- | ...
- Databricks 第7篇:管理Secret
有时,访问数据要求您通过JDBC对外部数据源进行身份验证,可以使用Azure Databricks Secret来存储凭据,并在notebook和job中引用它们,而不是直接在notebook中输入凭 ...
- python协程爬取某网站的老赖数据
import re import json import aiohttp import asyncio import time import pymysql from asyncio.locks im ...
- Mybatis Plus 3.4版本之后分页插件的变化
一.MybatisPlusInterceptor 从Mybatis Plus 3.4.0版本开始,不再使用旧版本的PaginationInterceptor ,而是使用MybatisPlusInter ...
- 二本学生拿到腾讯大厂offer的成长记录
本人迈莫,是在20年以春招实习生的身份进入鹅厂,经过重重波折,最终成为鹅仔一份子.接下来我会以我亲生经历为例,分享一下普通大学的学生也是可以进去大厂,拭目以待!!! 初入大学 惨遭毒打 时间倒回到17 ...
- Flask之路由系统
路由系统 路由的两种写法 1.第一种方法: def index(): return render_template('index.html') app.add_url_rule('/index', ' ...
- click的简单使用
click的简单使用 先通过一个简单的例子来认知一下click把 import click @click.command() @click.option('-p', '--port', default ...