数据结构(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 ...
随机推荐
- HNU 12876 Quite Good Numbers 完美数变形
筛法是一种很快的方法,贴代码纪念一下. 做法很像筛法 #include <iostream> #include <cstdio> #include <cstring> ...
- 题解 P3521 【[POI2011]ROT-Tree Rotations】
这道题采用权值线段树合并的解法. 首先讲一下解法中出现的两个概念:权值线段树与线段树合并. 所谓权值线段树,可以理解为维护的信息反过来的普通线段树,我个人认为值域线段树这个名字其实要准确一些. 举个例 ...
- 【Educational Codeforces Round 37 F】SUM and REPLACE
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 那个D函数它的下降速度是很快的. 也就是说到最后他会很快的变成2或者1 而D(2)==2,D(1)=1 也就是说,几次操作过后很多数 ...
- 【Codeforces Round #421 (Div. 2) A】Mister B and Book Reading
[题目链接]:http://codeforces.com/contest/820/problem/A [题意] 每天看书能看v页; 且这个v每天能增加a; 但是v有上限v1; 然后每天还必须往回看t页 ...
- C#做的CPU内存使用率
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- android 2048游戏实现
android 的2048小游戏完整实现:GridLayout布局(android 4.0及以上). 曾经做过一个2048的算法题,学了几天android,认为能够实现个安卓版的.也就动手写了个. 包 ...
- 【Linux】JDK+Eclipse 搭建C/C++开发环境
注:本文所提供的参考示例是在CentOS Linux环境下的安装,不保证适用于其他版本的Linux系统. · 安装前的注意事项 编译源代码是需要对应的代码编译工具的,本文中安装的Eclipse只 ...
- Java基础算法
i++;++i; i--;--i; int a=5;int b=a++;++放在后面,表示先使用a的值,a再加1b=5,a=a+1,a=6 int c=5;int d=++c;++放在前面,表示先将c ...
- Scrapy框架之日志等级
一.日志等级 CRITICAL:严重错误 ERROR:一般错误 WARNING:警告 INFO: 一般信息 DEBUG:调试信息 [注意:默认的日志等级是DEBUG] 二.日志等级设置 修改setti ...
- 【Henu ACM Round#17 A】Simple Game
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定是放在m-1或者m+1的. (m-1是左边的点都离a最近,而m+1则是右边的点都离他最近. 看看哪个更好就行 [代码] #inc ...