顺序表和链表的比较

  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++)——链表的更多相关文章

  1. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  2. linux内核数据结构之链表

    linux内核数据结构之链表 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该 ...

  3. 数据结构之链表-链表实现及常用操作(C++篇)

    数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 ...

  4. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  5. JAVA数据结构之链表

    JAVA数据结构之链表 什么是链表呢? 链表作为最基本的数据结构之一,定义如下: 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 简单来说呢,链 ...

  6. 基本数据结构:链表(list)

    copy from:http://www.cppblog.com/cxiaojia/archive/2012/07/31/185760.html 基本数据结构:链表(list) 谈到链表之前,先说一下 ...

  7. Linux C 数据结构 ->单向链表<-(~千金散尽还复来~)

    之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...

  8. ytu 2231: 交集问题(线性表)(数据结构,链表练习)

    2231: 交集问题(线性表) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 3[Submit][Status][Web Boar ...

  9. C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-单链表的实现-C语言 typedef struct LNode { int data; struct LNode* next; } LNode,*LinkList; //这两者等价.Li ...

  10. [C++] 数据结构应用——链表

    C++ 数据结构应用--链表 代码已经封装成class啦,方便使用. 头文件:Linklist.h #include <iostream> /*********************** ...

随机推荐

  1. 【转】postgreSQL​之autovacuum性能问题分析(二)

    如上篇文章提到,如果出现了autovacuum的问题,那么这可能是个悲伤的故事.怎么解决? 笔者觉得可以从如下几个方面着手去考虑解决问题,可以避免一些坑.1) 持续观察,是不是autovacuum问题 ...

  2. 微信小程序 A~Z城市选择器js文件

    微信小程序城市选择 [a~z] 的所有城市选择 city.js a~z排序的城市数据 addressChoose.js 其他js文件可引用 city.js /** * Created by yvded ...

  3. 浅谈 Java线程状态转换及控制

    线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...

  4. Spring学习(六)--Spring的IOC

    1.autowiring(自动依赖装配)的实现 自动装配中不需要对Bean属性做显示的依赖管理方式,只需要配置好autowiring的属性就可以,IOC容器会自动根据这个属性的配置通过反射自动找到属性 ...

  5. Feedforward neural networks前馈神经网络

    Feedforward neural networks or deep feedforward networks or multilayer perceptrons Pass input throug ...

  6. USB虚拟串口 使用基于stm32的RT-Thread

    参考我的RT Thread论坛文章 https://www.rt-thread.org/qa/thread-422644-1-1.html

  7. 烽火服务器IPMI远程装机

    连接控制台 一.通过vpn拨入进入内网,使用IE浏览器或者火狐等等,连接ilo地址.(需要安装java8.0,各个品牌的服务器需要的不一样) 二.启动虚拟连接控制台,进行控制主机 三.根据截图进行操作 ...

  8. 02 C语言最简单快速上手的IDE

    不要让开发环境 成为学习路上的拦路虎,先培养学习兴趣和学习路上的成就感,这个对于激励自己持续学习很重要. 等真正从小白入门了,甚至成为大牛了,能解决诸多困难问题了,安装个开发环境还会再是个什么难事吗? ...

  9. Bayer Pattern——RGGB

    原博客地址:https://blog.csdn.net/joe9280/article/details/46952947 参考:https://blog.csdn.net/wgx571859177/a ...

  10. 第十四周C++学习总结

    类模板使用方法:类模板名 <数据类型> 对象名: C++有个标准模板库(STL)(standard template library),编程时使用它会提高程序的可靠性. Stl 包含了(容 ...