线性表(顺序表创建)

线性表的创建主要利用了c语言中的结构体和指针,是对它们的更深层次的理解

顺序表实际上就是将将元素存入一个数组中,只不过这存入的每个元素所包含的数据

不只一个而是多个,所以需要先创建一个结构体来存储每个元素的所有数据,再将所有

元素存入数组中,便形成一个顺序表。

1、创建结构体存储每个数组元素所含的数据(使用指针动态存储)

typedef int ElemType;
//定义线性表所需变量的结构体
typedef struct {
	ElemType* pList; //地址
	int length;   //长度
	int listSize;  //元素个数
}SqList;

ElemType 为自己定义的数据类型,依据存储数据可自行定义

(案例中存储为整数所以为int)

 

2、初始化

//线性表的初始化函数
void initial(SqList &L) {
	L.pList = (ElemType*)malloc(100 * sizeof(ElemType)); //分配空间大小
	L.length = 0;       //将长度设置为0
	L.listSize = 100;   //设置最大元素个数
}

代码中的参数L为创建的线性表

3、线性表的插入函数


void Insert(SqList& L, int i,  ElemType e  ) {
	if (i <= L.length || L.length<L.listSize) {  //判断传入的参数是否符合要求
		for (int j = L.length - 1; j >= i - 1; j--) {
			L.pList[j + 1] = L.pList[j];
		}
		L.pList[i - 1] = e;
		L.length++;
	}
}

 该代码的算法分析为:

 先找到需要插入位置的元素,确定以此为分界线,前面存储的元素不变,从该数起到所存储的最后一个元素为止,倒着从最后一个元素开始后移一位,为要插入的数腾出空间,插入后表长加一

注意:输入参数时要看插入位置是否合法不得小于首元素的位置,也不可以超出存储容量

(数组的下标从0开始所以对应位置为i-1)

 

4、线性表的删除函数


void  Delete(SqList& L, int i) {
	if (i >= 1 && i <= L.length) {
		for (int j = i; j <= L.length - 1; j++) {
			L.pList[j - 1] = L.pList[j];
		}
		L.length--;
	}
}

算法分析:

先找到要删除的位置,以该位置到最后一个元素为止,将该元素的后一个元素存入该元素的位置覆盖要删除的元素,后面的元素依次往前覆盖,直到最后一个元素覆盖完

相当于从删除元素位置整体往前移一位,所以表长减一

 

5、线性表的查找函数



ElemType  Find(SqList& L, ElemType e) {
	for (int i = 0; i < L.length; i++) {
		if (L.pList[i] == e) {
			return i + 1;
		}
		return 0;
	}
}

利用循环依次遍历表中元素并与传入的参数比较若相同则返回该元素的位置

 

7、线性表的输出函数


void print1(SqList &L) {
	for (int i = 0; i < L.length; i++) {
		printf("%d ", L.pList[i]);
	}
}

利用循环依次打印输出表中的元素

 8、整体代码实现

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
//定义线性表所需变量的结构体
typedef struct {
	ElemType* pList; //地址
	int length;   //长度
	int listSize;  //元素个数
}SqList;

//线性表的初始化函数
void initial(SqList &L) {
	L.pList = (ElemType*)malloc(100 * sizeof(ElemType)); //分配空间大小
	L.length = 0;       //将长度设置为0
	L.listSize = 100;   //设置最大元素个数
}
//线性表的插入函数
void Insert(SqList& L, int i,  ElemType e  ) {
	if (i <= L.length || L.length<L.listSize) {  //判断传入的参数是否符合要求
		for (int j = L.length - 1; j >= i - 1; j--) {
			L.pList[j + 1] = L.pList[j];
		}
		L.pList[i - 1] = e;
		L.length++;
	}
}
//线性表的删除函数
void  Delete(SqList& L, int i) {
	if (i >= 1 && i <= L.length) {
		for (int j = i; j <= L.length - 1; j++) {
			L.pList[j - 1] = L.pList[j];
		}
		L.length--;
	}
}

//线性表的查找函数
ElemType  Find(SqList& L, ElemType e) {
	for (int i = 0; i < L.length; i++) {
		if (L.pList[i] == e) {
			return i + 1;
		}
		return 0;
	}
}

//线性表的输出函数
void print1(SqList &L) {
	for (int i = 0; i < L.length; i++) {
		printf("%d ", L.pList[i]);
	}
}
int main() {
	SqList L;//定义一个线性表的变量
	initial(L);    //调用初始化函数
	Insert(L, 1, 6);  //调用插入函数为空表插入元素
	Insert(L, 1, 5);

	print1(L);     //调用输出函数输出表
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值