首页 > 其他分享 >数据结构·线性表

数据结构·线性表

时间:2024-03-02 22:13:28浏览次数:17  
标签:结点 线性表 复杂度 元素 len next 插入 数据结构

线性表

一、逻辑结构和基本操作

1. 逻辑结构

  • 具有相同数据类型的n个数据元素的有限序列,表长n,n=0为空表
  • 表头:第一个元素
  • 表尾:最后一个元素
  • 除第一个元素外,每个元素有且仅有一个直接前驱
  • 除最后一个元素外,每个元素有且仅有一个直接后继

2. 基本操作

initList(&L);
len(L);
locateElem(L, i);
getElem(L, i);
listInsert(&L, i, e);
listDelete(&L, i, &e);
printList(L);
isEmptyList(L);
destroyList(&L);

二、顺序存储结构

1. 定义:又称顺序表,使用一组地址连续的存储单元,依次存储线性表的数据元素,使逻辑上相邻的两个元素物理位置也相邻

  • 存储空间的起始位置data[ ]
  • 顺序表最大存储容量MaxSize
  • 顺序表当前最大长度len
    特点
  • 随机访存,O(1)时间复杂度访问
  • 存储密度高,每个结点只存储数据元素
  • 无需花费空间建立数据之间的逻辑关系,由物理位置相邻特性决定
  • 逻辑上物理上均相邻,插入删除操作需要移动大量元素

2. 基本操作

(1)插入元素

//插入元素
boolean listInsert(SqList &L, int i, Elemtype e){
	if(i < 1 || i  L.len + 1)
		return -1;
	if(L.len = MaxSize)
		return -1;
	for(int j = L.len; j  i; j--)
		L.data[j] = L.data[j - 1];
	L.data[i - 1] = e;
	L.len++;
}

分析

  • 最好情况:在表尾插入 (i=n+1),不需要移动元素,时间复杂度为O(1)
  • 最坏情况:在表头插入 (i=1),元素后移n次,时间复杂度O(n)
  • 平均情况:假设\(P_i\) (\(P_i = \frac{1}{n+1}\)),是在第i个位置上插入一个结点的概率,则在长度为n的线性表中插入一个结点所需移动的平均次数为\(\frac{n}{2}\),其时间复杂度为O(n)
    (2)删除元素
//删除元素
boolean listDelete(SqList &L, int i, Elemtype e){
	if(i < 1 || i  L.len + 1)
		return -1;
	e = L.data[i-1];
	for(int j = i; j < L.len; j++)
		L.data[j-1] = L.data[j];
	L.len--;
	return true;
}

分析

  • 最好情况:在表尾插入 (i=n),不需要移动元素,时间复杂度为O(1)
  • 最坏情况:在表头插入 (i=1),元素后移n次,时间复杂度O(n)
  • 平均情况:假设\(P_i\) (\(P_i = \frac{1}{n+1}\)),是在第i个位置上插入一个结点的概率,则在长度为n的线性表中插入一个结点所需移动的平均次数为\(\frac{n-1}{2}\),其时间复杂度为O(n)
    (3)查找元素
	int locateElem(SqList &L, Elemtype e){
		int i;
		for(i = 0; i < L.len; i++)
			if(e == L.data[i])
				return i+1;
	}

分析

  • 最好情况:查找的元素在表头,仅需比较1次,时间复杂度O(1)
  • 最坏情况:查找的元素在表尾或不存在,需要比较n次,时间复杂度O(n)
  • 平均情况:假设\(P_i\) (\(P_i = \frac{1}{n}\))是在第i个位置上结点的概率,则在长度为n的线性表中插入一个结点所需移动的平均次数为\(\frac{n+1}{2}\),其时间复杂度为O(n)

链式存储结构

1.创建单链表

(1)头插法

  • 为新插入的结点分配内存空间
  • 每次都是把插入的新结点放入表头(头结点位置)
  • 链表结点的次序与输入的顺序相反

(2)尾插法

  • 为新插入的结点分配内存空间
  • 每次都是把插入的新结点放入表尾(尾结点位置)
  • 链表中的结点顺序与输入顺序一致

2.按值查找结点

  • 在链表中从第一个结点出发,顺指针next逐个向下搜索,直到找到第i个结点,否则返回最后一个结点的指针域NULL

3.按序号查找结点

  • 从链表第一个结点开始,由前往后按照序号递增定位到相应结点的位置,返回该值,需检查序号是否越界

4.插入

  • 插入操作是将值为x的新结点插入到单链表的第i个位置
  • 先检查插入位置是否合法
  • 找到待插入位置的前驱结点
  • 在其后将结点插入
	p = getElem(L, i-1)
	s-next = p-next;
	p-next = s;

5.删除

  • 将单链表的第i个结点删除
  • 先检查插入位置是否合法
  • 找到待删除位置的前驱结点
  • 删除其后结点
	p = getElem(L, i-1)
	q = p-next;
	q-next = p-next;
	free(q);

双链表

  • 双链表有两个指针prior和next,分别指向前驱和后继结点
  • 插入操作
	s-next = p-next;
	p-next-prior = s;
	s-prior = p;
	p-next = s;
  • 删除操作
	p-next = q-next;
	q-next-prior = p;
	free(q);

循环链表

  • 循环双链表和循环单链表
  • 静态链表使用数组来描述线性表的链式存储结构

标签:结点,线性表,复杂度,元素,len,next,插入,数据结构
From: https://www.cnblogs.com/Carrawayang/p/18049333

相关文章

  • 数据结构之线性表(顺序存储表)
    php<?php/***CreatedbyPhpStorm.*User:SillyCat*Date:2024/3/2*Time:18:47*/classSequenceList{private$item=array();private$length=0;publicfunction__construct(){//$this->item=$item;......
  • 基础数据结构->set&&map
    set&&mapBEGIN:惜墨如金set用法#include<bits/stdc++.h>usingnamespacestd;voidthe_map(){map<string,int>ds;stringkis="kis";ds[kis]=2;ds["a+a"]=3;ds["b+"]=4;ds["c-"]=5;//这样就可将这个“数......
  • Redis基础数据结构
    简单动态字符串SDS在Redis里面字符串随处可见比如//设置一个(key,value)为msg和helloworld的键值对setmsg"helloworld"在这里,msg和helloworld都是一个字符串.Redis自己构建了一个名为SDS(SimpleDynamicString简单动态字符串)的类,用于作为Redis底层字符串的默认实......
  • [思维] [树形数据结构] CF1379F1 Chess Strikes Back (easy version)
    注意到棋盘大小为$2n,2m$,共$2nm$个白格,同时国王数量为$nm$,尝试将$2$个国王捆绑在一块,即将棋盘均匀划分为若干个$2*2$大小的大格子。在此基础上观察,显然同一个大格子内的两个白格不能同时放置国王,同时大格子数量为$nm$,因此问题转化为判定能否使得所有大格子都有一个国王,......
  • 8-2. 数据结构及坐标保存加载
    使用ISaveable标识可保存的数据现在C#也像Java一样,接口可以写默认实现。大括号的写法和=>的写法是完全一致的使用DataManager来统一管理所有数据usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.InputSystem;pu......
  • 数据结构与算法
    绪论数据结构的基本概念数据:是信息的载体,分整数型与非整数型数据数据项:构成数据元素的最小不可分割单位,如学生的成绩数据元素:数据的基本单位,作为一个整体存储,如每个学生的信息数据类型:具有相同性质的计算机数据的集合,以及在这个集合上的一系列操作,比如in......
  • 数据结构【线段树】
    对于一个数据结构而言,我们总要能对其进行两件事:修改和操作。操作在这里是一个专有名词,专门指代求最值、求和等操作,具体能指代什么操作之后再聊。 如果朴素的用数组进行存储,那么修改是O(1)的,而操作往往是O(n)的。当操作指的是求和的时候,我们可以使用前缀和算法,前缀和使得操作是O(......
  • Qt 常见数据结构详解:从基本框架到实际应用
    在Qt框架中,数据结构的选择对于提高代码效率和性能至关重要。正确地使用数据结构可以显著提高应用程序的效率和响应速度。下面我们将详细介绍Qt中常见的几种数据结构,包括QString、QList、QVector、QMap、QHash、QSet和QPair。1.QStringQString是Qt中用于处理字符串的类。......
  • 算法入门:数据结构
    文章目录1.什么是算法和数据结构2.算法2.1.算法的特性2.2.算法设计的要求3.数据结构3.1.数组3.1.1.数组的定义3.1.2.数组的基本特性3.1.3.多维数组3.1.4.数组的同质性3.1.5.动态数组3.1.6.数组的优缺点3.1.7.数组的应用场景3.1.8.结论3.2.链表3.2.1.链表的定义......
  • 类:数据结构(模板)、数据类型(反射)、种类(amount)
    1.析构函数:在GC回收资源时,我们可以在析构函数中做事情; 2.也可以不用new关键字进行创建对象: 使用dynamic,可以直接调用name 3.静态构造器只能初始化静态成员 ......