数据结构之静态顺序表和动态顺序表

本文总结了静态顺序表和动态顺序表的异同点,它们都具有内存空间连续、数据顺序存储的特点。静态顺序表内存分配在函数栈,随函数调用结束自动回收,操作简单但可能导致内存泄漏。动态顺序表内存分配在堆内存,需手动释放,提供更灵活的操作并能避免不必要的开销。文章还详细介绍了两种顺序表的插入、删除、遍历等基本操作。
摘要由CSDN通过智能技术生成

@Sock对静态顺序表和动态顺序表的总结

简单概括他们的异同点

相同点:内存空间连续, 数据顺序存储

不同点:它们所占内存空间的位置不同, 静态定义一个顺序表, 顺序表所占的内存空间开辟在内存的静态区, 即所谓的函数栈上, 随着函数调用的结束, 这块内存区域会被系统自动回收; 而动态生成一个顺序表, 顺序表所占的内存空间开辟在内存的动态区, 即所谓的堆内存上, 这块区域不会随着函数调用的结束被系统自动回收, 而是需要程序员主动去释放它.

各自优点(个人认为)

静态顺序表:操作简单, 不用手动释放其内存空间, 不存在内存泄漏

动态顺序表:可以动态开辟内存空间, 操作灵活, 避免不必要的开销

静态顺序表的实现

定义一个静态顺序表

//定义一个静态顺序表
#define MAXSIZE 100
typedef int ElemType;
ElemType SqList[MAXSIZE];
int len;

向静态顺序表中插入元素

//向静态顺序表中插入元素
void InsertElem(ElemType* S, int* len, int pos, ElemType e) {
   
	//判断插入位置是否合理
	if (*len == MAXSIZE || pos < 1 || pos > *len + 1) {
   
		printf("表满或插入位置不合理\n");
		exit(0);
	}
	//调整插入位置, 准备插入指定元素
	for (int i = *len - 1; i >= pos - 1; --i) {
   
		*(S + i + 1) = *(S + i);
	}
	//插入指定元素
	*(S + pos - 1) = e;
	//元素个数加 1
	++(*len);
}

从静态顺序表中删除元素

//向静态顺序表中删除元素
void DelElem(ElemType* S, int* len, int pos) {
   
	//判断删除位置是否合理
	if (pos < 1 || pos > *len) {
   
		printf("删除位置不合理\n");
		exit(0);
	}
	//调整删除位置, 准备删除指定元素
	for (int i = pos; i < *len; ++i) {
   
		*(S + i - 1) = *(S + i);
	}
	//元素个数减 1
	--(*len);
}

遍历静态顺序表

//遍历顺序表
void Traverse(ElemType* S) {
   
	for (int i = 0; i < len; ++i) {
   
		printf("%d ", *(S + i));
	}
	printf("\n");
}

测试

#include <stdio.h>
#include <windows.h>

//定义一个静态顺序表
#define MAXSIZE 100
typedef int ElemType;
ElemType SqList[MAXSIZE];
int len;

//向静态顺序表中插入元素
void InsertElem(ElemType* S, int* len, int pos, ElemType e) {
   
	//判断插入位置是否合理
	if (*len == MAXSIZE || pos < 1 || pos > *len + 1) {
   
		printf("表满或插入位置不合理\n");
		exit(0);
	}
	//调整插入位置, 准备插入指定元素
	for (int i = *len - 1; i >= pos - 1; --i) {
   
		*(S + i + 1) = *(S + i);
	}
	//插入指定元素
	*(S + pos - 1) = e;
	//元素个数加 1
	++(*len);
}

//向静态顺序表中删除元素
void DelElem(ElemType* S, int* len, int pos) {
   
	//判断删除位置是否合理
	if (pos < 1 || pos > *len) {
   
		printf("删除位置不合理\n");
		exit(0);
	}
	//调整删除位置, 准备删除指定元素
	for (int i = pos; i < *len; ++i) {
   
		*(S + i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值