数据结构(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> /*********************** ...
随机推荐
- 使用kind搭建kubernetes
使用kind搭建kubernetes 目录 使用kind搭建kubernetes kind架构 创建集群 将镜像加载到kind的node中 配置kind集群 配置多节点 多控制面 指定Kubernet ...
- TIDB 笔记
整体架构:
- Layman CSS3+H5实现上下垂直居中的几种主要方法
方法1:通过 translate 移位来实现 H5+CSS3: <div style="width: 100%; height: 100%; margin:0; padding: 0; ...
- 027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑“与”运算符
027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑"与"运算符 本文知识点:Java中的逻辑"与"运算符 逻辑运 ...
- CentOS 7安装docker和常用指令
1.安装 yum -y install docker 2.启动 systemctl start docker // 启动 docker -v //查看版本号 systemctl stop docker ...
- Tensorflow学习笔记No.6
数据的批标准化 本篇主要讲述什么是标准化,为什么要标准化,以及如何进行标准化(添加BN层). 1.什么是标准化 传统机器学习中标准化也叫做归一化. 一般是将数据映射到指定的范围,用于去除不同维度数据的 ...
- 带UI 的小初高数学学习系统 —结对编程项目总结
一. 项目综述 本系统是基于QT Creator 4.3.0开发环境,开发语言C++,能够实现用户注册,发送短信验证码,用户登陆,用户选择题目类型和数量,显示用户本次答题基本功能.支持对用户账号查重, ...
- rxjs入门3之项目中ajax函数封装
项目中ajax函数封装 ⽹页应⽤主要数据源有两个:⼀个是⽹页中的DOM事件,另⼀个就是通过AJAX获得的服务器资源.我们已经知道fromEvent这个操作符可以根据DOM事件产⽣Observable对 ...
- golang 语言的特性
给函数传递参数的时候 map.slice.channel是按引用传递的 同一个变量不能用 := 这种方式创建并赋值两次. 一个包(package)的func .结构体类型变量如果要被外部的包调用.fu ...
- Cesium.Viewer
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...