1.11 线性表的顺序存储结构(C语言)

线性表顺序表示和实现:初始化及查找、插入、删除的实现

线性表顺序实现

  • 是用一组地址连续的存储单元依次存储线性表的数据元素
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef struct LNode *List;
struct LNode {
	int Data[N];
	int Last;//线性表最后一位
	int length; //当前长度
	int listsize;//当前分配的存储容量
};

/* 初始化 */
List MakeEmpty(List PtrL) {

	PtrL = (List)malloc(sizeof(struct LNode));
	PtrL->Last = -1;
	PtrL->length = 0;
	PtrL->listsize = sizeof(struct LNode) / sizeof(List);
	return PtrL;

}

/* 查找 */
int Find(int X, List PtrL) {
	int i = 0;
	while (i <= sizeof(PtrL->Data) / sizeof(int) - 1 && PtrL->Data[i] != X)
		i++;
	if (i > sizeof(PtrL->Data) / sizeof(int) - 1)  return -1;/* 如果没找到,返回错误信息 */
	else return i;/* 找到后返回的是存储位置 */

}
int Find2(int X, List PtrL) {
	int i = 0;
	while (i <= PtrL->length + 1 && PtrL->Data[i] != X)
		i++;
	if (i > PtrL->length + 1)  return -1;
	else return i;

}

/* 插入 */
bool Insert(List L, int X, int P)
{ /* 在L的指定位置P前插入一个新元素X */
	int i;

	/*
	if (L->Last >= N) {
		// 表空间已满,不能插入 
		printf("表满,动态扩容\n");
		L = (List)malloc(sizeof(int)*(L->listsize + 1));//动态扩容
		//L = (List)realloc(L->Data, (L->listsize + 1) * sizeof(int));
		//return false;
	}
*/
	if (P<0 || P> sizeof(L->Data) / sizeof(int) + 1) { /* 检查插入位置的合法性 */
		printf("位置不合法\n");
		return false;
	}

	for (i = sizeof(L->Data) / sizeof(int); i >= P; i--) {
		L->Data[i + 1] = L->Data[i]; /* 将位置P及以后的元素顺序向后移动 */
	}

	//L->Data[P + 1] = L->Data[P];
	L->Data[P] = X;  /* 新元素插入 */
	//L->listsize += 1;//更新顺序表大小
	//L->Last++;       /* Last仍指向最后元素 */
	//++L->length;
	//L->listsize++;
	return true;
}

/* 删除 */
bool Delete(List L, int P)
{ /* 从L中删除指定位置P的元素 */
	int i;

	if (P<0 || P>sizeof(L->Data) / sizeof(int)) { /* 检查空表及删除位置的合法性 */
		printf("位置%d不存在元素\n", P);
		return false;
	}
	for (i = P + 1; i <= sizeof(L->Data) / sizeof(int); i++)
		L->Data[i - 1] = L->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */
	L->Last = -1; /* Last仍指向最后元素 */
	//L->length--;
	//L->listsize--;
	return true;
}

void show(List PtrL) {
	printf("\n");
	printf("PtrL线性表最后一位为%d\n", PtrL->Last);
	printf("PtrL线性表长度为%d位\n", PtrL->length + 1);
	printf("PtrL线性表存储容量为%d位\n", PtrL->listsize);

}
void putlist(List PtrL,int m) {
	PtrL->length = m;
	printf("PtrL线性表元素为\n");
	for (int i = 0; i < PtrL->length + 1; i++) {
		printf("%d\t", PtrL->Data[i]);
	}
}

int main() {
	struct LNode L; //结构体变量
	List PtrL;//结构体指针 
	PtrL = NULL;
	int i = 0, m = 0;

	PtrL = MakeEmpty(PtrL);
	printf("PtrL->Data共%d位(包含\\0位)\n", sizeof(PtrL->Data) / sizeof(int) + 1);

	for (i = 0; i < N; i++) {
		scanf("%d", &(PtrL->Data[i]));
		if (i >= PtrL->length) m = i;
	}
	putlist(PtrL, m);
	show(PtrL);


	printf("PtrL->Data共%d位\n", sizeof(PtrL->Data) / sizeof(int));
	printf("2在PtrL第%d位\n", Find2(2, PtrL));

	Insert(PtrL, 1000, 0);//在第0位上插入1000
	printf("在第0位上插入1000\n");
	//PtrL->length = m;
	PtrL->length++;
	PtrL->listsize++;
	putlist(PtrL, m+1);
	show(PtrL);

	Insert(PtrL, 2000, 0);//在第0位上插入2000
	printf("在第0位上插入2000\n");
	//PtrL->length = m;
	PtrL->length++;
	PtrL->listsize++;
	putlist(PtrL, m +1);
	show(PtrL);


	Delete(PtrL, 2);//删除第2位
	printf("删除第2位\n");
	//PtrL->length = m;
	PtrL->length--;
	PtrL->listsize--;
	putlist(PtrL, m +1);
	show(PtrL);

	return 0;

}

运行

PtrL->Data共7(包含\0)
1 2 3 4 5 6
PtrL线性表元素为
1       2       3       4       5       6
PtrL线性表最后一位为-1
PtrL线性表长度为6位
PtrL线性表存储容量为9位
PtrL->Data共62在PtrL第1位
在第0位上插入1000
PtrL线性表元素为
1000    1       2       3       4       5       6
PtrL线性表最后一位为6
PtrL线性表长度为7位
PtrL线性表存储容量为10位
在第0位上插入2000
PtrL线性表元素为
2000    1000    1       2       3       4       5
PtrL线性表最后一位为5
PtrL线性表长度为7位
PtrL线性表存储容量为11位
删除第2位
PtrL线性表元素为
2000    1000    2       3       4       5       -1
PtrL线性表最后一位为-1
PtrL线性表长度为7位
PtrL线性表存储容量为10

博主如今掌握的C语言数组扩容是需要重新创建一个比原来空间大的数组并分配空间,然后把原来的数组内存空间释放掉,现如今数组满了之后插入,只能把最后一个元素顶替掉

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃鱼从来不吐刺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值