数据结构(C实现)------- 单链表
在单链表中,每个结点包括两部分:存放每个数据元素本身信息的数据域和存放其直接后继存储位置的指针域。
单链表结点的类型描写叙述:
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
}LNode,*LinkList;
单链表的存取必须从头指针開始进行,因此,通经常使用头指针来标识一个单链表。若头指针为空,则表示空链表。
有时,在单链表的第一个结点之前附设一个结点。称之为头结点。
单链表的操作:
1. 单链表的初始化Init_LinkList()
单链表的初始化是建立带头结点的空链表
//初始化运算
LinkList Init_LinkList(){
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
2. 求单链表的长度Length_LinkList(LinkList L)
//求表长运算
int Length_LinkList(LinkList L){
LinkList p;
int length = 0;
p = L->next;//p指向第一个结点
while(p){
length++;
p = p->next;
}
return length;
}
3. 按序号查找单链表Locate_LinkList_BySeq(LinkList L,int i)
从链表的头指针出发。逐个向后扫描,直到扫描到第i个结点为止。
//按序号定位
LinkList Locate_LinkList_BySeq(LinkList L,int i){
LinkList p = L;
int j = 0;
while(j < i && p->next){
p = p->next;
j++;
}
if(j == i)
return p;
else
return NULL;
}
4. 按值查找单链表Locate_LinkList_ByValue(LinkList L,ElemType e)
从单链表的第i个结点起,顺序扫描单链表,将结点的值和e相比較,直到找到一个和e相等的结点为止。返回该结点的指针。否则。若查遍整个链表找不到这种结点,则返回空指针。
//按值定位
LinkList Locate_LinkList_ByValue(LinkList L,ElemType e){
LinkList p = L->next;
while(p != NULL && p->data != e){
p = p->next;
}
return p;
}
5. 将新结点*s插入到结点*p之后的运算InsertAfter(LinkList p,ElemType e)
//将新结点插入到指定结点之后
void InsertAfter(LinkList p,ElemType e){
LinkList s;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
6. 将新结点*s插入到结点*p之前InsertBefore(LinkList L,LinkList p,ElemType e)
//将新结点插入到指定结点之前
void InsertBefore(LinkList L,LinkList p,ElemType e){
LinkList s,q;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
q = L;
//找到p的前驱结点
while(q->next != p)
q = q->next; s->next = p;
q->next = s;
}
7. 在单链表第i个结点之前插入新结点
//将新结点插入到第i个结点之前
void InsertBefore_Seqi(LinkList L,int i,ElemType e){
LinkList p,s;
//找到第i-1个结点
p = Locate_LinkList_BySeq(L,i-1);
if(p == NULL)
printf("i位置不合法");
else{
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
}
8. 在单链表第i个结点之后插入新结点
//将新结点插入到第i个结点之后
void InsertAfter_Seqi(LinkList L,int i,ElemType e){
LinkList p,s;
//找到第i个结点
p = Locate_LinkList_BySeq(L,i);
if(p == NULL)
printf("i位置不合法");
else{
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
}
9. 删除*p结点的后继结点DeleteAfter_Nodep(LinkList p)
//删除*p结点的后继结点
void DeleteAfter_Nodep(LinkList p){
LinkList s;
if(p->next == NULL)
printf("当前结点的后继结点为空\n");
else{
s = p->next;
p->next = s->next;
free(s);
}
}
10. 删除*p结点DeleteNodep(LinkList L,LinkList p)
//删除指定结点
void DeleteNodep(LinkList L,LinkList p){
LinkList q;
q = L;
//找到*p的前驱结点
while(q->next != p)
q = q->next;
q->next = p->next;
free(p);
}
11. 删除单链表的第i个结点Delete_Nodei(LinkList L,int i)
//删除单链表的第i个结点
void Delete_Nodei(LinkList L,int i){
LinkList q,p;
//找到第i个结点
q = Locate_LinkList_BySeq(L,i-1);
if(q == NULL)
printf("第i-1个结点不存在\n");
else{
p = q->next;
q->next = p->next;
free(p);
}
}
12. 删除单链表中全部值为e的结点。并返回值为e的结点的个数Delete_Node_Valuee(LinkList L,ElemType e)
//删除单链表中全部值为e的结点。并返回值为e的结点的个数
int Delete_Node_Valuee(LinkList L,ElemType e){
LinkList q,p;
int count = 0;
q = L;
while(q->next != NULL){
p = q->next;
if(p->data == e){
q->next = p->next;
free(p);
}
else
q = p;
}
return count;
}
13. 输出单链表Print_LinkList(LinkList L)
//打印链表
void Print_LinkList(LinkList L){
LinkList p = L->next;
while(p){
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
14. 头插法建立单链表Create_LinkListF(int n)
//头插法建立单链表
LinkList Create_LinkListF(int n){
LinkList L,s;
int i,x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(i=n;i>0;i--){
scanf("%d",&x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
15. 尾插法建立单链表Create_LinkListR(int n)
//尾插法建立单链表
LinkList Create_LinkListR(int n){
LinkList L,s,p;
int i,x;
L = (LinkList)malloc(sizeof(LNode));
p = L;
for(i = n;i > 0;i--){
scanf("%d",&x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
p->next = s;
p = s;
}
p->next = NULL;
return L;
}
数据结构(C实现)------- 单链表的更多相关文章
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- PHP数据结构之实现单链表
学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...
- C++ 数据结构学习二(单链表)
模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespa ...
- 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)
单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...
- 数据结构-多级指针单链表(C语言)
偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...
- TZOJ 数据结构实验:单链表元素插入
描述 实现函数CreateHeader用于创建空链表,实现Insert函数并调用它完成带头节点链表的创建. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. void PrintLinkL ...
- 分离的思想结合单链表实现级联组件:CascadeView
本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
随机推荐
- 今日SGU 5.30
SGU 190 题意:给你个n*n的矩形,然后上面有几个点不能放东西,然后问你能不能用1*2的矩形,把能放 东西的地方放满 收获:一开始想的是,dfs,然后感觉这样的话,代码很长,而且很容易超时, 看 ...
- 【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) D】Tree
[链接] 我是链接,点我呀:) [题意] 让你在树上找一个序列. 这个序列中a[1]=R 然后a[2],a[3]..a[d]它们满足a[2]是a[1]的祖先,a[3]是a[2]的祖先... 且w[a[ ...
- spring AOP的Pointcut注解报错
error at ::0 can't find referenced pointcut spring使用的是4.1.0,在项目中直接复制旧的aspectjweave.jar报错了 然后换成aspect ...
- Windows远程登录Linux
本文以Ubuntu Kylin1404为例,说明如何通过Windows远程登录Linux. 首先,要确保Ubuntu上SSH服务执行正常.默认情况下,Ubuntu已装有SSHclient.比方输入ss ...
- LicManager系统对各license类型终端客户机器的监控
与catia软件相似.以下这些软件都是汽车project设计软件.对汽车工业的的研发设计有着不可替代的作用.但它们都有着不同于各自的优势与不足之处. 可是在LicManager许可监控系统下,它们都是 ...
- [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树
链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...
- caioj1443:第k小的数Ⅲ
[传送门:caioj1443] 简要题意: 给出一颗n个点的树,给出每个点的权值,再给出n-1条边,有m个询问,每个询问输入x,y,k,输出第x节点到第y节点的路径上第k大的点 题解: 这是一道主席树 ...
- quartz 持久化 数据库表
此处只包括配置数据库操作 quartz 持久化数据库表格字段解释建表,SQL语句在dbTables文件夹中可以找到,介绍下我们开发主要使用到的表: (版本不一样,可能数据库表也不一样,这里使用2.2. ...
- Quart 学习
quartz版本使用2.2.1 梳理一下其中的流程,可以表示为: 0.调度器线程run() 1.获取待触发trigger 1.1数据库LOCKS表TRIGGER_ACCESS行加锁 1.2读取JobD ...
- BZOJ 2730 矿场搭建 Tarjan求割点
思路: Tarjan求出来点双&割点 判一判就行了 //By SiriusRen #include <stack> #include <cstdio> #include ...