数据结构个人笔记 第二课 线性表

线性表

线性表,全名为线性存储结构。使用线性存储数据的方式可以这样理解,即“把所有数据用一根线串起来,在存储到物理空间中”。

线性表

顺序存储结构和链式存储结构

将数据一次存储在连续的整块物理空间中,这种存储结构成为顺序存储结构

数据分散的存储在物理空间中,通过一根线保存这他们之间的逻辑关系,这种存储结构成为链式存储结构

线性表的逻辑结构

  • 非空表中有且只有一个第一个元素
  • 非空表中有且只有一个最后一个元素
  • 除第一个元素之外,每个元素均有且仅有一个前趋
  • 除最后一个元素之外,每个元素均有且仅有一个后继

前趋和后继

某一元素的左侧相邻元素称为“直接前趋”,位于此元素左侧的所有元素都统称为“前趋元素

某一元素的右侧相邻元素称为“直接后继”,位于次元素右侧的所有元素都统称为“后继元素
前趋和后继

线性表基本运算

  1. 初始化initiate(L),建立一个空表
  2. 求表长length(L),返回元素个数
  3. 取第i个元素get(L,i),其中1 <= i <= length(L)
  4. 元素定位locate(L,e),返回元素的存储位置
  5. 插入元素insertion(L,i,e),其中1 <= i <= length(L)+1
  6. 删除元素deletion(L,i),其中1 <= i <= length(L)
  7. 判表空empty(L)
  8. 置表空clear(L),清空表
  9. 求前趋prior(L,e)
  10. 求后继next(L,e)

顺序表

顺序表,全名顺序存储结构,是线性表的一种。
顺序表用于存储逻辑关系为“一对一”的数据,不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。
顺序表

顺序表的初始化

使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下2项数据:

  1. 顺序表申请的存储容量
  2. 顺序表的长度,也就是表中存储数据元素的个数

正常状态下,顺序表申请的存储容量要大于顺序表的长度

因此,在c语言中自定义顺序表:

typedef struct Table{
	int * head;//申明一个名为head的长度不确定的数组,也叫“动态数组”
	int length;//记录当前顺序表的长度
	int size;//记录顺序表分配的存储容量
}table;

这里的head是我们声明的一个未初始化的动态数组,不要只把他看做普通的指针

接下来开始顺序表的初始化,也就是初步建立一个顺序表。建立顺序表需要做如下工作:

  • 给head动态数据申请足够大小的物理空间
  • 给size和length赋初始值

因此,在c语言中初始化顺序表:

#define Size 5//对Size进行了宏定义,表示顺序表申请空间的大小
table initTable(){
	table t;
	t.head=(int*)malloc(Size*sizeof(int));//构造一个空的顺序表,动态申请存储空间
	if(!t.head){//如果申请失败,作出提示并直接退出程序
		printf("初始化失败");
		exit(0); 
	}
	t.length=0;//空表的长度初始化为0
	t.size=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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值