顺序表的储存结构
(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);//显示数据元素
}
}
运行结果: