目录
学习目标:
掌握线性表中的顺序表,了解其意义和基本操作
1.线性表的定义和特点
定义:线性表是具有相同数据类型的n个数据元素的有限序列,n为表长
特点:1.唯一一个被称作”第一个“的元素
2.唯一一个被称作"最后一个"的元素
3.除第一个元素外,每个元素只有一个前驱(第一个没有前驱)
4.除最后一个外,每个元素只有一个后继(最后一个没有后继)
2.基本操作
数据结构都是为了存储数据然后对数据进行操作,所以理解一个数据结构最基本的方式,就是要理解使用他们的基本操作
线性表主要分为顺序表和链表,我将从这两个方面进行学习讲解:
3.顺序表:
3.1 顺序表的定义:
静态分配:长度不可变化,用于已知表的长度进行存储
//顺序表实现
//静态分配
#include<stdio.h>
#define maxsize 10 //定义最大长度
typedef struct {
int data[maxsize];//开辟空间 用静态数组存放数据
int length;//当前顺序表长度
}sqlist;
//初始化
void initlist(sqlist& l) {
l.length = 0;
}
- 定义最大的长度,表示为顺序表最多可存储的数量
- 定义一个结构体,(我认为有一点点像实体类,不过结构体是一种数据实体,只有数据实体的属性,只用来进行存储数据),然后在结构体中开辟空间用来存储数据,并记录顺序表的长度
- 进行初始化操作,任何一个数据结构都要用定义初始化进行操作,避免里面有脏数据
动态分配:长度可变化
//动态分配
#include<stdio.h>
#include <corecrt_malloc.h>
#define InitSize 5
typedef struct {
int* data;
int MaxSize;
int length;
}SeqList;
void InitList(SeqList& L) {
L.data = (int*)malloc(sizeof(int) * InitSize);//开辟空间
L.length = 0;
L.MaxSize = InitSize;
}
//开辟新空间
void IncreatSize(SeqList& L,int len) {
int* p = L.data;//记录原来的空间初始位置
L.data = (int*)malloc(sizeof(int) * (InitSize + len));
for (int i = 0; i < L.length; i++)//赋值原来的数据
{
L.data[i] = p[i];
}
L.MaxSize = InitSize + len;
free(p);//释放原来空间
}
- 定义一个初始长度
- 一样定义结构体,data是指向动态分配的内存块,MaxSize是可以容纳的最大的空间,length是顺序表的长度
- 初始化顺序表,用data的地址使用malloc开辟一片空间,将这个顺序表的长度设置为0,然后将最大长度设置为初始长度
- 定义开辟新空间的方法,传给一个需要操作的顺序表和开辟的长度,用一个指针p记录原来空间的初始化位置,然后再在初始位置上开辟一个长度为初始长度加上需要开辟长的的空间,然后将所有的数据赋值给这个新空间的顺序表,最后将这个p,记录原来初始表的指针,也相当于一个初始表给释放
3.2 顺序表的增:
(省略:已经静态定义了一个链表)
//插入(判断插入的数据是否合格)
bool ListInsert(SqList& L, int i, int e) {//在第i个位置插入e这个元素
if ((i <= 0 || i > L.length) && L.length <= MaxSize) {
return false;
}
//将i位置所有数据往后移一位
for (int j = L.length; j >= i ; j--)
{
L.data[j] = L.data[j - 1];
}
//把e放入位置i
L.data[i - 1] = e;
L.length++;
return true;
- 目标:完成在第i个位置插入e这个元素,
- 传入一个顺序表,位置i和元素e,首先判断数据是否合理,如果i这个位置比0小比顺序表的最大长度还大,就返回错误表示数据不合理,同时要保证之前传入的顺序表是正确的,即顺序表的长度小于最大长度
- 将i位置的所有数据往后移以为
- 然后将e这个元素插入
- 最后将顺序表的长度+1
3.3 顺序表的删:
(省略:已经静态定义了一个顺序表)
//删除数据
bool ListDelete(SqList& L, int i, int &e) {//将第i个位置的数据删除,并返回这个元素
if (i<1 || i>L.length) {
return false;
}
//记录删除的元素
e = L.data[i - 1];
for (int j = i; j < L.length; j++)
{
L.data[j-1] = L.data[j];
}
L.length--;
}
- 目标:在第i个位置删除数据,并返回数据
- 传入一个顺序表,位置i,和一个新的int类型元素,用来返回数据
- 判断数据合理性
- 记录删除的数据
- 将这个位置的元素直接循环覆盖掉
- 然后让顺序表的长度-1
3.4 顺序表的改:
- 改变顺序表第i个位置的元素为目标元素即可,即L.data[i]=e
3.5 顺序表的查:
(省略:已经静态定义了一个顺序表)
//按位查找
int LocatElem(SqList& L, int i) {
return L.data[i - 1];
}
//按值查找
int GetElem(SqList& L, int x) {
int i = 0;
for ( i = 0; i < L.length; i++)
{
if (L.data[i] == x) {
break;
}
}
return i + 1;
}
- 目标:用两种方法查找顺序表中的位置
- 按位查找,直接返回顺序表中i位置的数据
- 按值查找,循环找到这个值之后返回这个数据所在的位置
才疏学浅,恳请扶正!!!