数据结构入门-C语言实现线性表的顺序存储

前言

等待许久,学校的数据结构终于开课了,借着这次机会,写写博客提升一下自己,也希望能帮助其他初学者。

简述

概念定义

线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。采用顺序存储结构的线性表通常称为顺序表。

相关操作

了解了数据结构的概念,接着了解一下相关的基本操作吧

	InitList(*L): 初始化操作,建立一个空的线性表L。
    LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
    ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e。
    ListDelete(*L,i): 删除线性表L中第i个位置元素。

接着附上一些文件,这里面有顺序表插入、删除、查找操作的动画演示
https://pan.baidu.com/s/1DxW1ifx6Pnnk-pTxa7lnxg

代码实现

定义类型

常用的定义方式如下,但是初学时,往往搞不懂define、typedef的意思,不好理解这段代码。

#define	maxsize  100 //线性表可能达到的最大长度
typedef int ElemType;
typedef  struct
{ 
     ElemType  elem[maxsize];  /* 线性表占用的数组空间*/
     int  length;    /*记录线性表的使用长度*/
} SeqList;

简单使用看看
在这里插入图片描述
实际上初学可以简化成如下形式

struct SeqList { 
         int  elem[100];	/* 线性表占用的数组空间*/
         int  length;			/*记录线性表的使用长度*/
  } ;

但是这样以来,每次用结构体的地方都多写了一个struct
在这里插入图片描述
而且如果一旦需要修改存储的数据类型那么,之后用到int的地方也得相应更改,而通过ElemType就可以避免这种情况,只更改一处即可。

具体操作

初始化

在这一步初始化一个顺序表,主要是长度初始化为0,当然也能同时将所有元素初始化为0。

/*初始化操作,建立一个空的线性表L。*/
void InitList(SeqList *list) 
{
//	int i;
	list = (SeqList*)malloc(sizeof(SeqList))   //将这句写在初始化函数中就无需在主函数中申请内存
	list->length = 0;
//	for(i = 0;i < maxsize;i ++)
//	{
//		list->elem[i] = 0;
//	}
}

初学的时候,最好便写边测试
在这里插入图片描述

扫描二维码关注公众号,回复: 5875740 查看本文章

插入

这里的代码,只需要做到合法性的校验再移动元素即可在指定位置插入。

void ListInsert(SeqList *list,int idx,ElemType e)
{
	int i;
	if(list->length >= maxsize)
	{
		printf("容量已达上限");
		return;
	}
	if(idx <= list->length && idx >= 0)
	{
		list->length ++;
		for(i = list->length;i > idx;i --)			//此处一定要由末尾开始,否则会覆盖成同一个数
		{
			list->elem[i] = list->elem[i-1];
		}
		list->elem[idx] = e;
	}
}

测试看一下
在这里插入图片描述

删除

同样也是合法性校验,然后直接移动覆盖掉待删除位置的元素即可。

/*删除指定索引的元素*/
void ListDelete(SeqList *list,int idx)
{
	int i;
	if(idx <= list->length && idx >= 0)
	{	
		list->length --;
		for(i = idx;i < list->length;i ++)
		{
			list->elem[i] = list->elem[i+1];
		}
	}
}

继续测试
在这里插入图片描述

查找

根据索引查找通过数组索引就能实现,这里实现根据值获得索引;返回-1表示未查找到。

int LocateElem(SeqList *list,ElemType e)
{
	int i;
	for(i = 0;i < list->length;i ++)
	{
		if(list->elem[i] == e)
		{
			return i;
		}
	}
	return -1;
}

再测试看看
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44112790/article/details/88039739