数据结构(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 ...
随机推荐
- win10如何设置开机自动启动热点WIFI?
1.编写脚本文件(先新建txt文件,编写代码内容netsh wlan start hostednetwork,最后重命名成HotSpot.bat):文件名称:HotSpot.bat,代码内容: net ...
- CF546E Soldier and Traveling(网络流,最大流)
CF546E Soldier and Traveling 题目描述 In the country there are \(n\) cities and \(m\) bidirectional road ...
- COGS——T2084. Asm.Def的基本算法
http://cogs.pro/cogs/problem/problem.php?pid=2084 ★☆ 输入文件:asm_algo.in 输出文件:asm_algo.out 简单对比时间 ...
- 给QQ群发送消息
地址:http://d.web2.qq.com/channel/send_qun_msg2 方式:POST 參数: r = {"group_uin":2393471267,&qu ...
- JVM-java字符编码
在JVM内部,所有的字符都是用Unicode编码的.而对于JVM所在操作系统的文件系统,可能有不同的编码类型. 由于JVM和OS文件系统所使用的编码方式不同,JVM在与操作系统进行数据交互的时候,就会 ...
- sublime text 2 licence
----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 BC ...
- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-qvc66dfs/supervisor/
# 安装supervisor 出错 pip3 install supervisor # 解决 sudo pip3 install supervisor
- 紫书 例题 9-4 UVa 116 ( 字典序递推顺序)
这道题在递推方式和那个数字三角形有一点相像,很容易推出来 但是这道题要求的是字典序,这里就有一个递推顺序的问题 这里用逆推,顺推会很麻烦,为什么呢? 如果顺推的话,最后一行假设有种情况是最小值,那么你 ...
- Spring MVC源码——Servlet WebApplicationContext
上一篇笔记(Spring MVC源码——Root WebApplicationContext)中记录了下 Root WebApplicationContext 的初始化代码.这一篇来看 Servlet ...
- FZU 1096 QS Network
QS Network Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: ...