【数据结构】线性表的知识点全面总结

2023-10-31

目录

1.线性表的顺序表示

    1.1顺序表的基本概念 

    1.2顺序表的基本操作 

         1.2.1插入

         1.2.2删除

         1.2.3查找 

2.线性表的链式表示

    2.1单链表

         单链表的基本概念

         2.1.1基本操作

               2.1.1.1单链表的建立

               2.1.1.2插入

               2.1.1.3删除

               2.1.1.4查找 

    2.2双链表

         2.2.1基本操作

               2.2.1.1插入

               2.2.1.2删除

               2.2.1.3遍历

    2.3循环链表

         2.3.1循环单链表

         2.3.2循环双链表 

               2.3.2.1循环双链表的插入

               2.3.2.2循环双链表的删除 

3.静态链表

4.顺序表和链表的比较 


1.线性表的顺序表示

1.1顺序表的基本概念 

存储结构:逻辑上相邻的数据元素物理上也相邻。

实现方式分为:静态分配和动态分配

静态分配:使用静态数组实现,大小一旦确定无法改变。

动态分配:使用动态数组实现,顺序表存满时可以用malloc动态扩展顺序表的最大容量,需要将数据元素复制到新的存储区域,并用free函数释放原区域。

1.2顺序表的基本操作 

1.2.1插入

最好时间复杂度:O(1)

最坏时间复杂度:O(n)

平均时间复杂度:O(n)

//插入
bool ListInsert(SqList &L,int i,int e)
{
	if (i < 1 || i > L.length + 1)         //判断i是否合法
		return false;
	if (L.length >= MaxSize)             //判断是否存满
		return false;
	for (int j = L.length;j >= i;j--)//插入结点的位置之后的元素依次后移
		L.data[j] = L.data[j - 1];
	L.data[i - 1] = e;                     //插入e
	L.length++;               //顺序表长度加一
	return true;
}

1.2.2删除

最好时间复杂度:O(1)

最坏时间复杂度:O(n)

平均时间复杂度:O(n)

//删除
bool ListDelete(SqList& L, int i, int e)
{
	if (i < 1 || i > L.length + 1)//判断i是否合法
		return false;
	e = L.data[i - 1];        //将删除结点位置的元素值赋给e
	for (int j = i;j < L.length;j++)//删除结点后面的元素依次前移
		L.data[j - i] = L.data[j];
	L.length--;              //顺序表长度减一
	return true;
}

1.2.3查找 

查找方式有按位查找和按值查找。

按位查找

//按位查找
int GetElem(SqList L, int i)
{
	return L.data[i - 1];
}

按值查找

最好时间复杂度:O(1)

最坏时间复杂度:O(n)

平均时间复杂度:O(n)

//按值查找
int LocateElem(SqList L.int e)
{
	for (int i = 0;i<L>length;i++)
		if (L.data[i] == e)
			return i + 1;
	return 0;
}

注意:C语言中,结构体的比较不能直接用“==” 

2.线性表的链式表示

2.1单链表

单链表的基本概念 

定义:线性表的链式存储。

两种实现方式:带头结点和不带头结点

带头结点的空表判断:L->next==NULL

不带头结点的空表判断:L==NULL

头结点和头指针的区分:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点时带头结点的链表中的第一个结点,结点内通常不存储信息。

2.1.1基本操作

2.1.1.1单链表的建立

头插法

应用:链表的逆置(带头结点的单链表的就地逆置:http://t.csdn.cn/J6bph) 

// 头插法建立单链表
LinkList List_HeadInsert(LinkList &L)
{
	LNode* s;
	int x;
	L = (LinkList)malloc(sizeof(LNode));//创建头结点
	L->next = NULL;               //初始为空链表
	scanf("%d", &x);             //输入结点的值
	while (x != 9999)          //循环结束条件,可以自己设置为其他值
	{
		s = (LNode*)malloc(sizeof(LNode));  //创建新的结点
		s->data = x;
		s->next = L->next;        
		L->next = s;          //将新结点插入表中,L为头指针
		scanf("%d", &x);
	}
	return L;
}

尾插法
//尾插法
LinkList List_TailInsert(LinkList& L)
{
	int x;
	L = (LinkList)malloc(sizeof(LNode));//创建头结点
	LNode* s, * r = L;      //r为表尾指针
	scanf("%d", &x);
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));  //创建新的结点
		s->data = x;
		r->next = s;                 
		r = s;                      //r指向新的表尾结点
		scanf("%d", &x);
	}
	r->next = NULL;
	return L;
}

2.1.1.2插入

后插 
//插入(后插)
s->next = p->next;
p->next = s;

前插
//插入(前插)
s->next = p->next;
p->next = s;
temp = p->data;    //交换数据域(偷天换日)
p->data = s->data;
s->data = temp;

2.1.1.3删除

按位序删除
p = GetElem(L, i - 1);  //查找删除位置的前驱节点
q = p->next;            //令q指向被删除结点
p->next = q->next;      //将*q结点从链中断开
free(q);                //释放结点的存储空间

指定结点删除

如果指定结点是最后一个结点时,需要特殊处理

q = p->next;            //令q指向*p的后继结点
p->data = p->next->data; //用后继结点的数据域覆盖
p->next = q->next;       //将*q结点从链中断开
free(q);                 //释放结点的存储空间

2.1.1.4查找 

 按位查找,按值查找,求单链表的长度

2.2双链表

2.2.1基本操作

2.2.1.1插入

1.s->next = p->next;
2.if(p->next!=NULL)
	p->next->prior = s;
3.s->next = p;
4.p->next = s;

上述代码的语句顺序不是唯一,但是1和2必须在4之前,否则会出现断链。 

2.2.1.2删除

//删除双链表结点*p的后继结点*q
bool DeleteNextNode(DNode* p)
{
	if (p == NULL)
		return false;
	DNode* q = p->next;//找到p的后继结点q
	if (q == NULL)      //p没有后继
		return false;
	p->next = q->next;
	if(q->next!=NULL)   //q不是最后一个结点
		q->next->prior = p;
	free(q);
	return true;
}

2.2.1.3遍历

后向遍历
//后向遍历
while (p != NULL)
{
	p = p->next;
}
前向遍历 
//前向遍历
while (p != NULL)
{
	p = p->prior;
}
//前向遍历(跳过头结点)
while (p->prior != NULL)
{
	p = p->prior;
}

2.3循环链表

2.3.1循环单链表

表尾结点的next指针指向头结点 

2.3.2循环双链表 

 表尾结点的next指针指向头结点 ;

 表头结点的prior指针指向表尾结点

2.3.2.1循环双链表的插入
//循环双链表的插入
/ bool InsertNextDNode(DNode * p, DNode * s)
{
	s->next = p->next;
	p->next->prior = s;
	s->prior = p;
	p->next = s;
}
2.3.2.2循环双链表的删除 
//循环双链表的删除 
p->next = q->next;
q->next->prior = p;
free(q);

3.静态链表

分配一整片的连续空间,容量固定不变,结束标志:next == -1

优点:增,删操作不需要大量移动元素。

缺点:不能随机存取,只能从头结点开始依次往后查找。 

4.顺序表和链表的比较 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】线性表的知识点全面总结 的相关文章

  • 6.deep_residual_network

    import torch import torch nn as nn import torchvision import torchvision transforms as transforms device torch device cu
  • VMware虚拟机桥接配置,访问局域网虚拟机

    目的 同一局域网 两台主机的虚拟机互通 背景 家里有两台电脑 一台台式 一台手提 想让他们的虚拟机可以直接通信而不是添加端口 以小米路由器为例 确认ip所在网段 机器信息 台式机 192 168 91 192 gt 虚拟机 192 168

随机推荐

  • CEP的设计模式--构建模块

    一 事件 EVENT 是由schema来定义的 是事件属性的元组 二 流 STREAM 事件流 time ordered sequence of event 是基于时间的事件序列 append only 不能移除事件 只能追加 unboun
  • vue3+ts项目打包后的本地访问

    注意 打包之后不可直接点击html访问 需要给项目安装本地服务 1 安装servenpm i g serve 2 打包项目npm run build 生成dist文件夹 3 本地访问serve dist 运行service dist之后的控
  • WebService 代码创建E9流程

    下载CXF http cxf apache org download html 生成客户端代码 tar zxvf apache cxf 3 2 7 tar gz cd apache cxf 3 2 7 bin wsdl2java clien
  • 定义类数组

    在java中 可以类为基本对象来定义一个数组 也就是直接以一个class作为一个类型 同时里面还有属性 编写学生类 包含姓名 学号 成绩三个属性 题目要求 1 为学生类添加构造函数给每个成员属性赋值 使用this关键字 2 为学生添加toS
  • Centos7部署轻量级自动化运维工具pssh (亲测)

    下载pssh安装包 root localhost wget https files pythonhosted org packages 60 9a 8035af3a7d3d1617ae2c7c174efa4f154e5bf9c24b36b6
  • js中数组的sort()方法及原理

    定义与用法 sort 方法用于对数组的元素进行排序 语法 arrayObject sort sortby 注意 sortby必须是函数 规定排序顺序 可选参数 返回值 对数组的引用 请注意 数组在原数组上进行排序 不生成副本 说明及原理 如
  • matlab打开出现桌面错误,手把手为您win10系统笔记本运行Matlab软件弹出已停止工作错误窗...

    今天小编分享一下win10系统笔记本运行Matlab软件弹出已停止工作错误窗口问题的处理方法 在操作win10电脑的过程中常常不知道怎么去解决win10系统笔记本运行Matlab软件弹出已停止工作错误窗口的问题 有什么好的方法去处理win1
  • C++ string类

    目录 1 为什么要学习string类 1 1 C语言中的字符串 1 2 两个面试题 暂不做讲解 2 标准库中的string类 2 1 string类 了解 2 2 string类的常用接口说明 注意下面我只讲解最常用的接口 1 string
  • webstorm+小程序相配合来开发小程序

    前言 webstorm可以安装的一个小程序插件 wechat miniprogram plugin 来实现小程序语法的高亮 并识别 rpx 这种小程序专有单位 还可以实现跟开发者工具中一些类似的操作功能 注意事项 1 小程序的根目录下的pr
  • 类对象数组初始化(三种方法)

    参考自 More Effective C 中文版 类对象数组初始化参考自 More Effective C 中文版 类对象数组初始化 如有一个如下类 class EquipmentPiece private int IDNumber pub
  • Python中tkinter库的menu的使用(制作菜单栏)

    import tkinter as tk wd tk Tk wd title 11 wd geometry 300x300 l tk Label wd text bg yellow pack 先载入对象 类似父类 嵌套对象 menubar
  • Nginx四层代理和七层代理的区别

    4层是指传输层的TCP UDP协议 7层是指应用层的HTTP协议 代理原理 4层代理 使用NAT Network Address Translation 技术 即网络地址转换 即请求进来的时候 nginx只修改数据包里面的目标IP 源IP
  • 浅谈密码破译

    关于密码破译 今天见到一篇文章 读来心中甚是激动 特记录在案 目录 密码破译 1 两种方式 2 双重验证系统2FA 3 密码登录的常见方式 3 1 基于 存储密码 的密码登录步骤 3 2 基于 密码散列 的密码登录步骤 4 暴力破解散列 密
  • 【NLP傻瓜式教程】手把手带你CNN文本分类(附代码)

    文章来源于NewBeeNLP 作者kaiyuan 写在前面 本文是对经典论文 Convolutional Neural Networks for Sentence Classification 1 的详细复现 应该是 基于TensorFlo
  • 200与mcgs485实例 smart_西门子Smart触摸屏与S7-200Smart无线PPI通讯实例

    在工业现场往往会用触摸屏来控制现场的PLC工作 若是遇到布线不方便或是工期较短的情况 那么可以采用无线数据交换的方式来完成触摸屏对PLC的RS485无线通讯 1 自由串口协议 2 Modbus协议 3 PPI协议 以下为大家介绍一种使用PP
  • 小结:token放在header中好处,HTTP Header详解(OAuth JWT等)

    1 Token机制相对于Cookie机制又有什么好处及基于JWT的Token认证机制实现 支持跨域访问 Cookie是不允许垮域访问的 这一点对Token机制是不存在的 前提是传输的用户认证信息通过HTTP头传输 引自 http www c
  • git status显示修改了大量文件

    diff git a Android mk b Android mk old mode 100644 new mode 100755 原来是filemode的变化 文件chmod后其文件某些位是改变了的 如果严格的比较原文件和chmod后的
  • Scratch编程入门-画图模块1【认识画图模块积木】

    在少儿编程软件Scratch中 拥有许多的拓展模块 在这些拓展模块里面 画笔模块 无疑是使用最多的模块之一 无论是中国电子学会的图形化编程考级题目还是线上线下的少儿编程比赛以及蓝桥杯甚至白名单的比赛题目中 使用该模块的画图类编程题目都是最重
  • C++ map用法总结

    1 map简介 map是STL的一个关联容器 它提供一对一的hash 第一个可以称为关键字 key 每个关键字只能在map中出现一次 第二个可以称为该关键字的值 value map以模板 泛型 方式实现 可以存储任意类型的数据 包括使用者自
  • 【数据结构】线性表的知识点全面总结

    目录 1 线性表的顺序表示 1 1顺序表的基本概念 1 2顺序表的基本操作 1 2 1插入 1 2 2删除 1 2 3查找 2 线性表的链式表示 2 1单链表 单链表的基本概念 2 1 1基本操作 2 1 1 1单链表的建立 2 1 1 2