💖我不知道将要去向何方,但我已在路上!💖
文章目录
- 前言
- 一、线性表的定义和基本操作(逻辑结构和基本运算)
- 1.线性表定义
- 2.几个概念
- 3.线性表的基本操作
- 二、顺序表的定义和基本操作(顺序存储结构)
- 1.顺序表
- 2.顺序表的实现——静态分配
- 3.顺序表的实现——动态分配
- 4.顺序表的特点
- 5.顺序表的插入、删除
- 6.顺序表的查找
- 三、链表的定义和基本操作(链式存储结构)
- 1.单链表
- 2.双链表
- 3.循环链表
- 4.静态链表
- 四、顺序表VS链表
前言
线性表分为顺序表和链表,根据不同的存储方式有不同的实现过程,今天学习线性表有关的内容,从定义初始化到增删改查再过渡到以后的学习。这是数据结构的开始,加油xdm!冲!🤞🤞🤞
一、线性表的定义和基本操作
1.线性表定义
线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列(有次序),n为表长,n=0时线性表为空表。若用L命名,则表示为:L=(a1,a2,···,an)
问:所有的整数按递增次序排列,是线性表吗?
答:不是,整数是无限的!
2.几个概念
位序:ai是线性表中的第i个元素,位序为i。
a1为表头元素,an为表尾元素。
除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。
注:位序从1开始,数组下标从0开始
3.线性表的基本操作
①InitList(&L):初始化表,构造一个空的线性表L,分配内存空间。
②DestoryList(&L):销毁操作,销毁线性表,并释放空间。
③Lislnsert(&L,i,e):插入操作,在表L的第i个位置插入元素e。
④LiDelete(&L,i,&e):删除操作,删除表L中的第i个位置的元素,并用e返回删除元素的值。
⑤LocateElem(L,e):按值查找,在表L中查找给定的值的元素。
⑥GetElem(L,i):按位查找,获取表L第i个位置的元素的值。
⑦Length(L):求表长,返回线性表L的长度,即L中数据元素的个数。
⑧PrintList(L):输出操作,按顺序输出表L所以的值。
⑨Empty(L):判空操作,若L为空表返回true,否则返回false.
tip:对数据的操作无非是创销,增删改查;参数类型要看实际问题;可自己定义其他基本操作;可随自己习惯更改函数名等。
注:当对参数的修改结果要“带回来”时,需要用&
二、顺序表的定义和基本操作(实际为线性表的顺序存储)
线性表在计算机中如何表示呢?往下看
1.定义
用顺序存储的方式实现线性表顺序存储
2.顺序表的实现——静态分配
#define MaxSize 10//定义最大长度;
typedef struct {
int date[MaxSize];//用静态的数组存放数据元素;
int length;//顺序表当前长度;
}SqList;
void InitList(SqList &L)
{
for (int i = 0; i < MaxSize; i++)
{
L.date[i] = 0;//初始化为0;
L.length = 0;
}
}
int main()
{
SqList L; //声明一个顺序表;
InitList(L); //初始化顺序表;
return 0;
}
注意:如果不对顺序表数据进行默认初始化,内存中会有遗留的“脏数据”
问:当“数组”存满了怎么办?
答:放弃治疗,顺序表长确定后无法更改(存储空间是静态的)
问:如果刚开始就声明一个很大的空间呢?
答:浪费!!!
要解决上述问题,可用动态分配。
3.顺序表的实现——动态分配
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10//默认的最大长度。
typedef struct {
int* date; //指示动态分配数组的指针
int MaxSize; //数组的最大长度
int length; //顺序表的当前长度
}SeqList;
void InitList(SeqList& L)
{
L.date = (int*)malloc(InitSize * sizeof(int));//用malloc申请一片连续的内存空间
L.length = 0;
L.MaxSize = InitSize;
}
//增加长度
void IncreaseSize(SeqList& L, int len)
{
int* p = L.date;
L.date = (int*)malloc((L.MaxSize + len) * sizeof(int));
for (int i = 0; i < L.MaxSize; i++)
{
L.date[i] =