线性表
线性表,全名为线性存储结构。使用线性存储数据的方式可以这样理解,即“把所有数据用一根线串起来,在存储到物理空间中”。
顺序存储结构和链式存储结构
将数据一次存储在连续的整块物理空间中,这种存储结构成为顺序存储结构
数据分散的存储在物理空间中,通过一根线保存这他们之间的逻辑关系,这种存储结构成为链式存储结构
线性表的逻辑结构
- 非空表中有且只有一个第一个元素
- 非空表中有且只有一个最后一个元素
- 除第一个元素之外,每个元素均有且仅有一个前趋
- 除最后一个元素之外,每个元素均有且仅有一个后继
前趋和后继
某一元素的左侧相邻元素称为“直接前趋”,位于此元素左侧的所有元素都统称为“前趋元素”
某一元素的右侧相邻元素称为“直接后继”,位于次元素右侧的所有元素都统称为“后继元素”
线性表基本运算
- 初始化initiate(L),建立一个空表
- 求表长length(L),返回元素个数
- 取第i个元素get(L,i),其中1 <= i <= length(L)
- 元素定位locate(L,e),返回元素的存储位置
- 插入元素insertion(L,i,e),其中1 <= i <= length(L)+1
- 删除元素deletion(L,i),其中1 <= i <= length(L)
- 判表空empty(L)
- 置表空clear(L),清空表
- 求前趋prior(L,e)
- 求后继next(L,e)
顺序表
顺序表,全名顺序存储结构,是线性表的一种。 顺序表用于存储逻辑关系为“一对一”的数据,不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。
顺序表的初始化
使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下2项数据:
- 顺序表申请的存储容量
- 顺序表的长度,也就是表中存储数据元素的个数
正常状态下,顺序表申请的存储容量要大于顺序表的长度
因此,在c语言中自定义顺序表:
typedef struct Table{
int * head;
int length;
int size;
}table;
这里的head是我们声明的一个未初始化的动态数组,不要只把他看做普通的指针
接下来开始顺序表的初始化,也就是初步建立一个顺序表。建立顺序表需要做如下工作:
- 给head动态数据申请足够大小的物理空间
- 给size和length赋初始值
因此,在c语言中初始化顺序表:
#define Size 5
table initTable(){
table t;
t.head=(int*)malloc(Size*sizeof(int));
if(!t.head){
printf("初始化失败");
exit(0);
}
t.length=0;
t.size=Size;
return t;
}
这样做之后,整个顺序表初始化的过程被封装到了一个函数中,此函数返回值是一个已经初始化完成的顺序表。这样做的好处是增加了代码的可用性,也更加美观。与此同时,顺序表初始化过程中,要注意对物理空间的申请进行判断,对申请失败的情况进行处理,这里只进行了“输出提示信息和强制退出”的操作,可以根据你自己的需要对代码中的if语句进行改进。
综合代码,这里还加了一点东西
#include<iostream>
#include<stdlib.h>
#define Size 5
using namespace std;
typedef struct Tabel{
int * head;
int length;
int size;
}table;
table initTable(){
table t;
t.head=(int*)malloc(Size*sizeof(int));
if(!t.head){
printf("初始化失败");
exit(0);
}
t.length=0;
t.size=Size;
return t;
}
void displayTable(table t){
for(int i = 0;i<t.length;i++){
printf("%d ",t.head[i]);
}
printf("\n");
}
int main(){
table t = initTable();
for(int i = 1;i<= Size;i++){
t.head[i-1]=i;
t.length++;
}
printf("顺序表中存储的元素分别是: \n");
displayTable(t);
return 0;
}
|