数据结构(C++)——链表
顺序表和链表的比较
1.存取方式
顺序表可以随机访问,而链表只能从表头顺序查找。(因此经常查找顺序表某一个元素时,顺序表更适合)
2.逻辑结构与物理结构
顺序表中,逻辑上相邻的元素,其物理存储位置也相邻。链表中,逻辑相邻的元素,其物理存储位置不相邻。
3.查找、插入和删除操作
按值查找时,顺序表链表时间复杂度都为O(n)。
按序号查找时,顺序表时间复杂度为O(1),而链表时间复杂度为O(n)。
插入和删除元素中,顺序表平均移动半个表的长度,而链表只需要改变一下指针域的值就可以了。
(因此,当线性表经常进行插入和删除元素时,选链表更合适)
4.空间分配
顺序表在静态存储分配的情形下,存储空间装满了就不能扩充;链表就不存在这个问题。
链表结构
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}*LinkList,*PNode;
头插法创建单链表
LinkList HeadInsertList(LinkList L){
//头插法创建单链表,头插法简单,但元素的顺序是插入顺序的逆序
L=new Node; //分配头节点空间
L->next=NULL; //头结点的next指针刚开始指向NULL
if(!L){ //分配失败时,返回NULL
return L;
}
LinkList s;
ElemType x;
cin>>x;
while(x!=9999){ //输入9999停止输入
s=new Node; //插入的节点
if(!s){
cout<<"内存分配失败!"<<endl;
return NULL;
}
s->data=x;
s->next=L->next;
L->next=s;
cin>>x;
}
return L;
}
尾插法创建单链表
LinkList TailInsertList(LinkList L){
//尾插法创建单链表,链表的顺序和插入顺序一样,但需要尾指针
L=new Node;
if(!L){
cout<<"内存分配失败!"<<endl;
return L;
}
LinkList r,s;
r=L; //r为尾节点,每次指向最后一个节点
ElemType x;
cin>>x;
while(x!=9999){
s=new Node;
if(!s){
cout<<"内存分配失败!"<<endl;
return NULL;
}
s->data=x;
r->next=s;
r=s;
cin>>x;
}
r->next=NULL; //最后要将尾节点指针指控
return L;
}
按序号返回节点的指针
PNode GetElem(LinkList L,int i){
//按序号返回节点的指针
int j=0; //刚开始p指向头节点
PNode p=L;
if(i<0){
return NULL;
}
while(j<i&&p!=NULL){ //节点和序号一起移动
p=p->next;
j++;
}
return p; //查找失败时,p为NULL
}
返回链表中第一个元素为e节点的指针
PNode FindElem(LinkList L,ElemType e){
//返回链表中第一个元素为e节点的指针
PNode p=L->next;
while(p&&p->data!=e){ //从第一个节点开始,元素不为e时,就向后推一位
p=p->next;
}
return p; //没找到元素时,返回NULL
}
将e插入第i个节点上
void InsertList(LinkList L,ElemType e,int i){
//将e插入第i个节点上
PNode p=GetElem(L,i-1); //找到前驱元的位置
if(!p){
return ;
}
PNode s;
s=new Node;
if(s==NULL){
cout<<"内存分配失败!"<<endl;
return ;
}
s->data=e;
s->next=p->next;
p->next=s;
}
删除第i个节点
void DeleteList(LinkList L,int i){
//删除第i个节点
PNode p=GetElem(L,i-1);
PNode q=p->next;
p->next=q->next;
delete q;
}
求链表的长度
int LengthList(LinkList L){
//求链表的长度
PNode p=L;
int i=0; //计数器变量
if(L==NULL){
return 0;
}
while(p->next!=NULL){
p=p->next;
i++;
}
return i;
}
利用递归删除链表中值为x的节点
void Delete1(LinkList &L,ElemType x){
//利用递归删除链表中值为x的节点
PNode p;
if(L==NULL){
return ;
}
if(L->data==x){
p=L;
L=L->next;
delete p;
Delete1(L,x);
}else {
Delete1(L->next,x);
}
}
删除链表中值为x的节点
void Delete2(LinkList &L,ElemType x){
//删除链表中值为x的节点
PNode p=L->next,pre=L,det;
while(p!=NULL){
if(p->data==x){
det=p; //det指向的是要删除的节点
pre->next=p->next; //pre指向的是要删除结点的前一个结点
p=p->next;
delete det;
}
else{
p=p->next;
pre=pre->next;
}
}
}
数据结构(C++)——链表的更多相关文章
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- linux内核数据结构之链表
linux内核数据结构之链表 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该 ...
- 数据结构之链表-链表实现及常用操作(C++篇)
数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 ...
- python实现数据结构单链表
#python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...
- JAVA数据结构之链表
JAVA数据结构之链表 什么是链表呢? 链表作为最基本的数据结构之一,定义如下: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 简单来说呢,链 ...
- 基本数据结构:链表(list)
copy from:http://www.cppblog.com/cxiaojia/archive/2012/07/31/185760.html 基本数据结构:链表(list) 谈到链表之前,先说一下 ...
- Linux C 数据结构 ->单向链表<-(~千金散尽还复来~)
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- ytu 2231: 交集问题(线性表)(数据结构,链表练习)
2231: 交集问题(线性表) Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 6 Solved: 3[Submit][Status][Web Boar ...
- C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...
- [C++] 数据结构应用——链表
C++ 数据结构应用--链表 代码已经封装成class啦,方便使用. 头文件:Linklist.h #include <iostream> /*********************** ...
随机推荐
- 我把公司 10 年老系统改造 Maven,真香!!
公司有几个老古董项目,应该是 10 年前开发的了,有一个是 JSP + Servlet,有一个还用的 SSH 框架,打包用的 Ant,是有多老啊,我想在座的各位很多都没听过吧. 为了持续集成.持续部署 ...
- JVM学习目录
JVM学习目录 JVM的整体结构 1.类加载子系统 类加载子系统 2.运行时数据区 运行时数据区总览 堆.栈.方法区的详细图解 2.1.程序计数器 程序计数器 2.2.本地方法栈 本地方法栈 2.3. ...
- python中的三大流程
三大流程又叫程序控制流程 在我们编写代码时,程序是怎么运行的,要用到程序控制流程.在普通代码中,运行的方向是从上到下,从左到右 这就是顺序(逐行扫描). 第二个是分支(又叫选择)结构,例如在编写代码时 ...
- java获取一天前的时间
获取一天前的时间 Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); ...
- Centos-检查文件系统并尝试修复-fsck
fsck 检查文件系统并尝试修改错误,修复对象为设备,本质上是调用 /sbin/fsck.filesystemName 命令, filesystemName是指定设备的文件系统类型,如图分区中有文件丢 ...
- Centos-gizp压缩文件-gzip gunzip
gzip gunzip 将一般文件进行压缩或者解压,默认扩展名为 .gz, 本质上 gunzip是gzip硬链接,压缩和解压都可以通过gzip完成 gzip 相关选项 -d 解压 -r 递归压缩目录下 ...
- java泛型之通配符?
一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...
- Go 接口类型
接口作用 Go语言中的接口是一种类型,类似于Python中的抽象基类. Go语言中使用接口来体现多态,是duck-type的一种体现. 如,只要一个东西会叫,会走,那么我们就可以将它定义为一个动物的接 ...
- 实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
一.实验目的 Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解调 ...
- SDN实验 3: Mininet 实验——测量路径的损耗率
验 3:Mininet 实验--测量路径的损耗率 一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定:初步了解 Mininet 安装时自带的 POX ...