数据结构C语言——动态顺序表的实现

        本篇文章主要介绍的是数据结构中使用C语言来实现动态顺序表的一些基本操作。至于基本操作就不再一一列举,与静态顺序表的操作相差不大,可参考:数据结构C语言——静态顺序表的实现。

初始化动态分配:

        注意:动态分配不是链式存储,它同样也是顺序存储结构,物理结构没有变化,依旧是随机存取的方式,只是分配的空间大小可以变化。

(1)C的初始化动态分配语句:

L->data = (ElemType*)malloc(sizeof(ElemType) * InitSize);//申请空间

(2)C++的初始化动态分配语句:

L.data = new ElemType[InitSize]; 

动态顺序表扩容:

//动态增加
bool IncreaseSize(SqList* L,int len) {
	ElemType* p = L->data;//生成指向原来顺序表的存储空间的指针
	L->data = (ElemType *)malloc(sizeof(ElemType) * (L->MaxSize + len));
	for (int i = 0; i < L->length; i++) {
		L->data[i] = p[i];//数据转移
	}
	L->MaxSize = L->MaxSize + len;
	free(p);
	return true;
}

完整代码:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
typedef int ElemType;
typedef struct {
	ElemType* data;
	int length;
	int MaxSize;
}SqList;
//初始化顺序表
void InitList(SqList* L) {
	L->length = 0;//初始化表长
	L->MaxSize = InitSize;//初始化最大容量
	L->data = (ElemType*)malloc(sizeof(ElemType) * InitSize);//申请空间
}
//顺序表的输出
bool  SqListPrint(SqList L) {
	if (L.length == 0) {
		printf("顺序表为空!!!\n");
		return false;
	}
	printf("输出顺序表:\n");
	for (int i = 0; i < L.length; i++) {
		printf("L.data[%d]=%-4d", i, L.data[i]);
		if ((i + 1) % 5 == 0) {
			printf("\n");
		}
	}
	printf("end\n");
}
//顺序表的插入
bool ListInsert(SqList* L, int i, ElemType e) {
	if (i<1 || i>L->length + 1) {
		printf("插入元素位置无效!!!\n");
		return false;
	}
	if (L->length >= L->MaxSize) {
		printf("插入元素已满!!!\n");
		return false;
	}
	for (int j = L->length; j >= i; j--) {
		L->data[j] = L->data[j-1];
	}
	L->data[i - 1] = e;
	L->length++;
	return true;
}
//顺序表删除
bool ListDelete(SqList* L, int i,ElemType *e) {
	if (i<1 || i>L->length) {
		printf("删除元素位置无效!!!\n");
		return false;
	}
	if (L->length <= 0) {
		printf("这是一个空表!!!\n");
		return false;
	}
	*e = L->data[i - 1];
	for (int j = i; j < L->length; j++) {
		L->data[j - 1] = L->data[j];
	}
	L->length--;
	return true;
}
//顺序表按值查找
int LocateElem(SqList L, ElemType e) {
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] == e) {
			return i + 1;
		}
	}
	return 0;
}
//顺序表按位查找
int GetElem(SqList L, int i) {
	if (i<1 || i>L.length) {
		printf("查找位序不在合法范围内!!!\n");
		return 0;
	}
	return L.data[i - 1];
}
//动态增加
bool IncreaseSize(SqList* L,int len) {
	ElemType* p = L->data;//生成指向原来顺序表的存储空间的指针
	L->data = (ElemType *)malloc(sizeof(ElemType) * (L->MaxSize + len));
	for (int i = 0; i < L->length; i++) {
		L->data[i] = p[i];//数据转移
	}
	L->MaxSize = L->MaxSize + len;
	free(p);
	return true;
}
int main() {
	SqList L;//定义顺序表
	InitList(&L);//初始化顺序表
	//输入元素
	ListInsert(&L, 1, 1);
	ListInsert(&L, 2, 2);
	ListInsert(&L, 3, 3);
	ListInsert(&L, 4, 4);
	ListInsert(&L, 5, 5);
	ListInsert(&L, 6, 6);
	SqListPrint(L);
	//扩容
	IncreaseSize(&L, 20);
	ListInsert(&L, 7, 7);
	ListInsert(&L, 8, 8);
	ListInsert(&L, 9, 9);
	ListInsert(&L, 10,10);
	ListInsert(&L, 11,11);
	ListInsert(&L, 12,12);
	SqListPrint(L);
	printf("%d\n", L.MaxSize);
	//删除
	int e;
	ListDelete(&L, 3, &e);
	printf("e=%d\n", e);
	SqListPrint(L);
	//按值查找
	int j = 2;
	printf("该元素下标为:%d\n", LocateElem(L, j));
	//按位查找
	int i = 1;
	printf("该元素的值为:%d\n", GetElem(L, i));
	
	return 0;
}

运行截图:

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值