《数据结构》2.3单链表(single linked list)
//单链表节点的定义
typedef struct node
{
datatype data;
struct node *next;
}LNode,*LinkList; //LNode是节点类型,LinkList是指向LNode类型节点的指针类型
LinkList H; //定义头指针变量 //建立单链表(时间复杂度均为O(n))
//逆序建立单链表(头插法)
LinkList Creath_LinkList()
{
Linklist L = NULL; //空表
LNode *s;
int e; //设数据元素的类型为int
scanf("%d", &e);
while(e != flag) //flag为设置的线性表数据元素结束标志
{
s = malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
scanf("%d", &e);
}
return L;
}
//顺序建立单链表(尾插法)
LinkList Creatr_LinkList()
{
LinkList L = NULL;
LNode *s, *r = NULL;
int e; //设数据元素的类型为int
scanf("%d", &e);
while(e != flag) //flag为设置的线性表数据元素结束标志
{
s = malloc(sizeof(LNode));
s->data = e;
if(L == NULL) L = s;//插入的节点是第一个节点
else r->next = s; //插入的节点是其他节点
r = s; //r恒指向新的节点
scanf("%d", &e);
}
if(r != NULL) r->next = NULL;//对于非空表,尾部节点的指针于置为空指针
return L;
} //求表长(时间复杂度均为O(n))
//设L是不带头节点的单链表
int length_LinkList1(LinkList L)
{
LNode *p = L;
int i; //i是计数器
if(p == NULL) return ; //空表的情况
i = ; //在非空表的情况下,p所指的是第一个节点
while(P->next)
{
p = p->next; i++;
}
return i;
}
//设L是带头节点的单链表(引入头节点概念,在后面的算法中若不加额外说明则都认为单链表是带头节点的)
int length_LinkList2(LinkList L)
{
LNode *p = L; //p指向头节点
int i = ; //i是计数器
while(P->next)
{
p = p->next; i++; //p所指的正是第i个节点
}
return i;
} //查找操作(时间复杂度均为O(n))
//按序号查找
LNode *Getc_LinkList(LinkList L, int i) //在单链表L中查找第i个节点,找到则返回其指针,否则返回空
{
LNode *p = L; //L为头节点
int j = ;
while(p->next != NULL && j<i)
{
p = p->next; j++;
}
if(j == i) return p;
else return NULL;
}
//按值查找
LNode *Locate_LinkList(LinkList L,datatype e) //在单链表L中查找值为e的节点,找到后返回其指针,否则返回空
{
LNode *p = L->next; //L为头节点
while(p != NULL && p->data != e)
p = p->next;
return p;
} //插入操作
//在某节点之后插入节点(将*s插入*p的后面,时间复杂度为O(1))
s->next = p->next;
p->next = s; //这两条指令顺序不能改变,否则会使链表断开
//在某节点之前插入节点(将*s插入*p的前面,时间复杂度为O(n))
q = L;
while(q->next != p)
q = q->next; //查找*p的直接前驱*q
s->next = q->next;
q->next = s;
//定位插入(把数据域值为e的节点插入链表中作为第i个节点,时间复杂度为O(n))
int Insert_LinkList(LinkList L, int i, datatype e) //在链表的第i个位置上插入值为e的元素
{
LNode *p, *s;
p = Get_LinkList(L, i-); //查找第(i-1)个节点
if(p == NULL)
{
printf("参数i错"); return ; //第(i-1)个节点不存在,不能插入
}
else
{
s = malloc(sizeof(LNode)); //申请节点
s->data = e;
s->next = p->next; //新节点插入在第(i-1)个节点的后面
p->next = s;
return ;
}
} //删除操作
//删除指针指向单链表中的节点
//(1)删除*p(时间复杂度为O(n))
q->next = p->next; //设查找到*p的直接前驱为*q
free(p);
//(2)删除*p的直接后继节点,假设其存在(时间复杂度为O(1))
s = p->next; //设*p的直接后继节点为*s
p->next = s->next;
free(s);
//删除单链表L的第i个节点(时间复杂度为O(n))
int Del_LinkList(LinkList L, int i) //删除单链表上L的第i个节点
{
LinkList p, s;
p = Get_LinkList(L, i-); //查找第(i-1)个节点
if(p == NULL)
{
printf("第i个节点不存在"); return -;
}
else
{
if(p->next == NULL)
{
printf("第i个节点不存在"); return ;
}
else
{
s = p->next; //s指向第i个节点
p->next = s->next; //从链表中删除s
free(s); //释放s
return ;
}
}
}
说明:
1.顺序建立单链表
由于第一个节点加入时原链表为空,它作为链表的第一个节点是没有直接前驱节点的,所以它的地址就是整个链表的起始地址,该值需要放在链表的头指针变量中;而后面再插入的其他节点都有直接前驱节点,其地址只需放入直接前驱节点的指针域即可。
2.头节点
为了统一操作,在链表的头部加入一个特殊节点,即头节点;头节点的类型与数据节点的类型一致,标识链表的头指针变量L中存放的是头节点的地址,那么即使是空表,头指针L也不为空(其中存放着头节点的地址);将头节点看作链表第一个节点的直接前驱,那么链表的第一个节点也有直接前驱,则无须再对第一个节点进行额外操作;
头节点的加入使得“空表”和“非空表”的处理成为一致,其数据域无定义,指针域存放的是第一个数据节点的地址。
算法思路:
1.求表长
设一个指针变量p和计数器i,初始化后,如果p所指节点后面还有节点,p向后移动,计数器i同时加1,直至p指向表尾。可以从单链表不带头节点和带头节点两个角度出发来设计算法(注意:计算线性表的长度时不包括头节点)。
2.查找操作
1)按序号查找:从链表的第一个节点起,判断当前节点是否是第i个节点,若是,则返回该节点的指针,否则,根据指针域寻找下一个节点,直到表结束为止。若没有找到第i个节点,则返回空。
2)按值查找:从链表的第一个节点起,判断当前节点数据域的值是否等于e,若等于,则返回该节点的指针,否则,根据指针域寻找下一个节点,直到表结束为止。若表中没有节点数据域的值等于e,则返回空。
3.插入操作(定位插入)
(1)寻找第i个节点的直接前驱第(i-1)个节点,若存在,则继续第(2)步,否则结束;
(2)申请新节点,并为其数据域赋值为e;
(3)将新节点作为第(i-1)个节点的直接后继插入单链表中,结束。
4.删除操作(删除单链表L的第i个节点)
(1)寻找第(i-1)个节点;若存在,则继续第(2)步,否则结束;
(2)若存在第i个节点,则继续第(3)步,否则结束;
(3)删除第i个节点,结束。
《数据结构》2.3单链表(single linked list)的更多相关文章
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- PHP数据结构之实现单链表
学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...
- 【数据结构与算法】——链表(Linked List)
链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下: 链表是以节点的方式来存储的,是链式存储. 每个节点包含data域,next域:指向下一个节点. 如图:链表的各个节点不 ...
- 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 ...
- 【数据结构】单链表&&静态链表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...
- 分离的思想结合单链表实现级联组件:CascadeView
本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...
随机推荐
- UVA 11384 正序数排列
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- HDU 5980 Find Small A(寻找小A)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- 关于equals、hashcode和集合类的小结
一.首先明确一点:equals()方法和hashcode()方法是Object类里的方法. 查看源码可以知道,在Object类中equals(obj)方法直接返回的是 this == obj 的值. ...
- Openstack+Kubernetes+Docker微服务实践之路--弹性扩容
服务上线就要顶的住压力.扛的住考验,不然挨说的还是我们这帮做事的兄弟,还记得上图这个场景吗 老办法是服务集群部署,但总归有个上限,之前跟阿里合作的时候他们有个弹性计算可以通过设置CPU的阀值来动态扩展 ...
- Ubuntu 和 Redhat / Fedora 服务管理命令对比表(附Fedora16新的服务管理工具systemctl )
以 apache/httpd 服务作为例子 任务 Red Hat / Fedora Ubuntu Ubuntu (with sysv-rc-conf or sysvconfig) 立即启动/停止某服务 ...
- [地图SkyLine二次开发]关于IE内存限制问题(1G)
相信很多人也遇到过同样的问题,地图加载中,IE占用的内存一直增加,到了1G多一些的时候,IE就崩溃了. 在网上查阅了一番,有很多结果,下面归纳一下: a).64bit的IE最多可达到4G的内存,但Sk ...
- A*算法 -- 八数码问题和传教士过河问题的代码实现
前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...
- java ZipOutputStream压缩文件,ZipInputStream解压缩
java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...
- DPDK编译步骤
大页内存分配: NUMA系统(现在的linux一般都是) echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048 ...
- Oracle 表连接
Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不 ...