数据结构之顺序表的实现

俗话说,好记性不如一个烂笔头,在过了若干天之后我果然忘了顺序表的实现…
以此写一篇文章,防止自己忘记也帮助刚入门的小伙伴。

顺序表也就是采用一片连续的内存空间来存储相应的数据,既然是连续也就造成了空间必然有限,但带来的优点也有很多,比如操作很快,理解容易…既然时连续的内存空间,采取数组的形式是最为方便的了。

顺序表的基本操作的实现还是蛮简单的,
主要操作有

Status List_Init(SqListPtr L);//初始化列表
void List_Destory(SqListPtr L); //销毁列表
void List_Clear(SqListPtr L); //清空列表
bool List_Empty(SqListPtr L); //判断列表是否为空
int List_Size(SqListPtr L); //返回列表的元素个数
Status List_Retrieve(SqListPtr L, int pos,ElemType * elem);//取出位置pos处的元素
Status List_Locate(SqListPtr L,ElemType elem,int * pos);//定位elem所在的位置
Status List_Insert(SqListPtr L, int pos, ElemType elem);//在pos处插入elem
Status List_delete(SqListPtr L, int pos);//删除pos处的元素
Status List_Prior(SqListPtr L, int pos, ElemType * elem);//取出pos的前驱元素
Status List_Next(SqListPtr L, int pos, ElemType * elem);//取出pos的后继元素
void List_display(SqListPtr L);//将现行表中的元素输出

请忽略status带来的效果(判断是否执行成功暂且不重要)
顺序表主要依靠下标来插入,删除,找到相应元素,这里就不将所有的基本操作贴上来了。
相应解释在注释中!

选取一部分操作进行解释,所有函数均定义成void型方便理解,

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MAX 100
typedef struct LinkList{
	int *elem;//定义一个指针变量,用来存取一片连续的内存空间的首地址
	int LinkList_Size;//顺序表当前长度
	int LinkList_MaxSize;//顺序表最大长度
}LinkList,*LinkListPtr;//LinkListPtr 指向顺序表的指针
void LinkList_Init(LinkListPtr L){//初始化顺序表
	L->elem = (int *)malloc(sizeof(int)*MAX);//开辟相应的内存空间,malloc有点细节建议看看百度百科
	L->LinkList_Size = 0;//开始  当前顺序表的长度为0
	L->LinkList_MaxSize = MAX;//设置最大上限
}
void LinkList_Create(LinkListPtr L,int elem){//存取数据
	if(L->LinkList_Size == L->LinkList_MaxSize){//判断顺序表是否满了
		printf("顺序表已满!\n");
		return ;
	}
	L->elem[L->LinkList_Size] = elem;//存数据
	L->LinkList_Size++;//长度加一
}
void LinkList_Insert(LinkListPtr L,int pos,int elem){//在指定位置插入指定元素
	if(pos < 1 || pos > L->LinkList_Size +1 ){//插入的位置不能小于1和大于末尾
		printf("插入位置不合法!\n");
		return ;
	}
	if(L->LinkList_Size == L->LinkList_MaxSize){//判断顺序表是否满了
		printf("顺序表已满!\n");
		return ;
	}
	for(int i = L->LinkList_Size ; i >= pos ; i--){//开始移动数据,从最后元素开始移动
													//每一个元素都往后移动一位
		L->elem[i] = L->elem[i - 1];
	} 
	L->elem[pos -1 ] = elem;//在指定位置插入元素
	L->LinkList_Size++;//长度加一
}
void LinkList_Print(LinkListPtr L){
	if(L->LinkList_Size == 0){
		printf("顺序表为空!\n");
		return ;
	}
	for(int i = 0;i<L->LinkList_Size;i++){//打印顺序表
		printf("%d\t",L->elem[i]);
	}
	printf("\n");
}
void LinkList_Delete(LinkListPtr L,int pos){
	if(pos < 1 || pos > L->LinkList_Size){//判断删除的位置是否合法
		printf("要删除的位置不合法!\n");
		return ;
	}
	for(int i = pos -1 ;i < L->LinkList_Size ; i++){//从要删除的位置开始移动,所有元素都往前移动一位
		L->elem[i] = L->elem[i+1];
	}
	L->LinkList_Size--;//长度减一
}
int main(){
	system("color 9F");
	LinkList L;
	LinkList_Init(&L);
	int x;
	//测试用
	printf("输入顺序表的元素(0结束输入):\n");
	while(1){
		scanf("%d",&x);
		if(x) LinkList_Create(&L,x);
		else break;
	}
	LinkList_Print(&L);
	LinkList_Delete(&L,2);
	LinkList_Print(&L);
	LinkList_Insert(&L,2,99);
	LinkList_Print(&L);
	 
}

Ps:看不懂的操作,想不明白的操作,拿出纸笔,画就完事了!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值