0
点赞
收藏
分享

微信扫一扫

数据结构-顺序表(c语言)

顺序表的储存结构

(1)当采用像c语言这样的高级程序设计语言描述数据结构问题时,实现顺序存储结构的方法是使用数组。
(2)数组有静态数组和动态数组两种。静态数组存储空间的申请和释放由系统自动完成,动态数组存储空间的申请和释放由用户通过调用系统函数自己完成。无论静态数组还是动态数组,其功能都是向系统申请一块地址连续的有限空间,只是申请空间的方法不一样。


顺序表操作的实现:

(1)定义结构体SeqList
在这里插入图片描述

为了用c语言描述如上图所示的顺序表,定义结构体SeqList如下

typedef struct 
{
	DataType List[MaxSize];
	int size;
}SeqList;

其中,DataType为数组元素(即数据元素)的数据类型,MaxSize表示数组元素的最大个数,List表示顺序表的数组成员,size表示顺序表中当前存储的数据元素个数成员,且必须满足size<=MaxSize.


(2)初始化ListInitiate(L)
//初始化ListInitiate(L)
void ListInitiate (SeqList *L)//初始化顺序表L
{
	L->size=0;//定义初始化数据元素个数
}

*由于函数中要改变参数L的size域的值,因此参数L应设计为输出型参数,即参数L设计为SeqList的指针类型,否则,size域的修改值将不能带回去。


(3)求当前数据元素个数ListLength(L)
int ListLength(SeqList L)//返回当前数据元素个数
{
	return L.size;
}

(4)插入数据元素ListInsert(L,i,x)
//插入数据元素
int ListInsert(SeqList *L,i,DataType x)//在第i个位置插入数据元素x
{
	int j=0;
	if(L->size>=MaxSize)
	{
		printf("顺序表已满无法插入数据!\n");
		return 0;

	}
	else if(i<0||i>L->size)
	{
		printf("参数i不合法!\n");
		return 0;
	}
	else
	{
		//从后向前依次后移数据,为输入做准备
		for(int j=L->size;j>i;j--)
		{
			L->List[j]=L->List[j-1];

		}
		L->List[i]=x;//插入元素x
		L->size++;//元素个数加一
     return 1;
	}
}

因为顺序表的当前数据元素个数size初始时为0,而有一个数据元素时为1(也就是说,数据元素个数size比数组下标,即参数i的值大1), 所以插入位置参数i应大于等于0且小于等于size。当参数i不在上述区间内时,即可判定参数出错。数组的存储空间是有限的,若当前已经存满了数组的MaxSize个存储空间,则不能继续插入。


(5)删除数据元素ListDelete(L,i,x)
int ListDelete(SeqList *L,int i,DataType *x)//删除顺序表L中第i个位置处的数据元素并保存在x中
{
	int j;
	if(L->size=0)
	{
		printf("顺序表为空无数据可删!\n");
		return 0;
	}
	else if(i<0||i>L->size-1)
	{
		printf("参数i不合法 \n");
		return 0
	}
	else
	{
		*x=L->List[i];
		//从删除那个数据元素开始依次向前移动数据
		for(int j=i+1;j<=L->size;j++)
		{
			L->List[j-1]=L->size[j];
		}
		
		L->size--;//元素个数减一
		return 1;
	}
}

若顺序表中当前没有一个数据元素,则无法进行删除,应判断为函数调用出错。删除位置参数i应大于等于0且小于等于size-1,当参数i不在上述区间内时,即为参数出错。


(6)取数据元素ListGet(L,i,x)
int ListGet(SeqList L,int i,DataType *x)
	 //取顺序表L中第i个数据元素存于x中,成功返回1,失败返回0
 {
	 if(i<0||i>L.size-1)
	 {
		 printf("参数i不合法!\n");
		 return 0;
	 }
	 else
	 {
		 *x=L.List[i];
		 return 1;
	 }
 }

取数据元素操作与删除数据元素操作类同,但更简单,取数据元素操作只需取数据元素List[i]到参数x中。


设计举例:

编程实现如下任务:建立一个线性表,依次输入1,2,3,4…10,然后删除数据元素5,最后依次显示当前线性表中的数据元素,假设该线性表的数据元素个数在在最坏的情况下不会超过100个,要求使用顺序表。


程序设计如下:

#include <stdio.h>
#define Maxsize 100
typedef int Datatype;
#include "SeqList.h"
void main(void)
{
	int i;
	int x;
	SeqList myList;
	ListInitiate(&myList);//初始化函数调用
	for( i=0;i<10;i++)//插入10个数据元素
		ListInsert(&myList,i,i+1);//插入函数调用
	ListDelete(&myList,4,&x);//删除函数调用
	//显示循序表的当前数据元素
	for( i=0;i<ListLength(myList);i++)//当前元素个数函数调用
	{
		ListGet(myList,i,&x);//取元素函数调用
		printf("%d\t",x);//显示数据元素
	}
}

运行结果:
在这里插入图片描述

举报

相关推荐

0 条评论