数据结构:顺序表的C语言实现

顺序结构

定义: 将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。
原理: 顺序表存储是将数据元素放到一块连续的内存存储空间,存取效率高,速度快。但是不可以动态增加长度。
优点: 存取速度高效,通过下标来直接存储
缺点: 1.插入和删除比较慢(运算时间代价O(n)) 2.不可以增长长度
比如:插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序。在顺序表中,插入一个元素平均移动的次数是 n 2 \frac{n}{2} 2n次,删除一个元素平均移动此时是 n − 1 2 \frac{n-1}{2} 2n1

#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 5	//初始内存大小
#define LIST_INCREASE_SIZE 5	//内存增量
typedef int seqType;	//表中存放数据类型
typedef int Status;		//返回的操作状态
typedef struct 	//表结构
{
	seqType* ele;	//顺序表首元素地址
	int length;	//表长度
	int size;	//表大小
}SqList;

//创建表
SqList CreateList(){
	SqList* List= (SqList*)malloc(sizeof(SqList));
	return *List;
}

//初始化表
Status InitList(SqList &List){
	List.ele=(seqType*)malloc(sizeof(seqType)*LIST_INIT_SIZE);
	if(!List.ele){
		printf("由于内存不足分配失败。\n");
		return -1;
	}
	//数据长度为空
	List.length=0;
	//表大小为初始大小
	List.size=LIST_INIT_SIZE;
	return 1;
}

//插入元素
Status Insert(SqList &List,int index, seqType m){
	//插入元素的位置大于表的长度
	if(index>List.length){
		printf("插入位置大于表长度。\n");
		return -1;
	}
	//插入位置为负数则插入到表最后位置
	if(index<0){
		index=List.length;
	}
	//表长度等于表大小则表存储空间已满,需要追加内存。
	if(List.length==List.size){
		printf("表存储空间已满,分配新的内存空间。\n");
		seqType* extra=(seqType*)realloc(List.ele, sizeof(seqType)*List.size+LIST_INCREASE_SIZE);
		if(!extra){
			printf("分配新的内存失败。\n");
			return -1;
		}
		List.ele=extra;
		//更新表大小
		List.size+=LIST_INCREASE_SIZE;
	}
	//插入核心操作:将插入点后的元素向后移动一个单位
	for (int i = List.length; i>index; i--)
	{
		List.ele[i]=List.ele[i-1];
	}
	//插入
	List.ele[index]=m;
	//更新数据长度
	List.length++;
	return 1;
}
//删除元素
Status Delete(SqList &List,int index){
	//因为这里index表示删除的下标而不是物理位置,故-1
	if(index>List.size-1){
		printf("删除位置超出数据长度。\n");
		return -1;
	}
	//删除下标小于0则删除最后一个元素
	if(index<0){
		index=List.size-1;
	}
	//删除核心操作,元素前移
	for (int i = index; List.length-1>i ; i++)
	{
		List.ele[i]=List.ele[i+1];
	}
	//更新数据长度
	List.length--;
	return 1;
}
//销毁表
int Destory(SqList &List){
	//释放内存
	free(List.ele);
	//更新数据长度和表长度
	List.length=0;
	List.size=0;
}

int main(int argc, char const *argv[])
{
	SqList List=CreateList();
	InitList(List);
	Insert(List,-1,1);
	Insert(List,-1,2);
	Insert(List,-1,3);
	Insert(List,-1,9);
	Insert(List,-1,5);
	Delete(List,2);
	for (int i = 0; i < List.length; i++)
	{
		printf("ele[%d]:%d\n",i,List.ele[i]);
	}
	printf("数据长度:%d\n",List.length);
	printf("表大小:%d\n",List.size);
	//Destory(List);
	return 0;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值