顺序表和链表的比较

  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. 我把公司 10 年老系统改造 Maven,真香!!

    公司有几个老古董项目,应该是 10 年前开发的了,有一个是 JSP + Servlet,有一个还用的 SSH 框架,打包用的 Ant,是有多老啊,我想在座的各位很多都没听过吧. 为了持续集成.持续部署 ...

  2. JVM学习目录

    JVM学习目录 JVM的整体结构 1.类加载子系统 类加载子系统 2.运行时数据区 运行时数据区总览 堆.栈.方法区的详细图解 2.1.程序计数器 程序计数器 2.2.本地方法栈 本地方法栈 2.3. ...

  3. python中的三大流程

    三大流程又叫程序控制流程 在我们编写代码时,程序是怎么运行的,要用到程序控制流程.在普通代码中,运行的方向是从上到下,从左到右 这就是顺序(逐行扫描). 第二个是分支(又叫选择)结构,例如在编写代码时 ...

  4. java获取一天前的时间

    获取一天前的时间 Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); ...

  5. Centos-检查文件系统并尝试修复-fsck

    fsck 检查文件系统并尝试修改错误,修复对象为设备,本质上是调用 /sbin/fsck.filesystemName 命令, filesystemName是指定设备的文件系统类型,如图分区中有文件丢 ...

  6. Centos-gizp压缩文件-gzip gunzip

    gzip gunzip 将一般文件进行压缩或者解压,默认扩展名为 .gz, 本质上 gunzip是gzip硬链接,压缩和解压都可以通过gzip完成 gzip 相关选项 -d 解压 -r 递归压缩目录下 ...

  7. java泛型之通配符?

    一.在说泛型通配符" ?" 之前先讲几个概念 1.里氏替换原则(Liskov Substitution Principle, LSP): 定义:所有引用基类(父类)的地方必须能透明 ...

  8. Go 接口类型

    接口作用 Go语言中的接口是一种类型,类似于Python中的抽象基类. Go语言中使用接口来体现多态,是duck-type的一种体现. 如,只要一个东西会叫,会走,那么我们就可以将它定义为一个动物的接 ...

  9. 实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令

    一.实验目的 Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解调 ...

  10. SDN实验 3: Mininet 实验——测量路径的损耗率

    验 3:Mininet 实验--测量路径的损耗率 一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定:初步了解 Mininet 安装时自带的 POX ...