数据结构之线性表的初始化及其操作
–
⽂章⽬录
TOC]
–
⼀.准备⼯作
1.定义存储空间的分配量
#define MAXSIZE 10
2.定义结果状态函数Status 返回成功失败的状态。
误区:刚开始我把Status理解成了C语⾔的⼀个关键字,后来才知道Status是⼀个⽤户⾃定义函数,是定义的⼀种类型。⽤来表⽰成功或失败的状态。
typedef int Status;//Status是函数的类型
3.定义ElemType 函数类型,需要根据实际情况⽽定。
typedef为类型定义标识符,作⽤是为⼀个数据类型或者结构(⽐如struct)重新定义⼀个名称。
所以定义:
typedef int ElemType;
作⽤是:将关键字int重命名为ElemType。
int和ElemType代表的类型是⼀样的,声明和定义的变量是等价的
4.通过结构类型来定义顺序表存储类型与定义。
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
以上顺序表类型的定义【初始化】的含义:
为顺序表分配⼀个容量为MAXSIZE⼤⼩的数组空间,数组名为data ,并将线性表的当前长度length设为0.
[注意点]:
为什么⽤数组来对线性表进⾏存储?
顺序表的定义:⽤⼀组地址连续的存储单元依次存储线性表的各个数据元素,即⽤顺序存储的线性表
它采⽤的数据元素存储⽅式是静态存储,这种⽅式还是有很多缺点的,因为你不知道⾃⼰实现到底需要计算机分配多少空间,在编程活动中,特别是我们的⼩学期中,很多同学出现了溢出或空间不够的现象,也就是传说中的“烫烫”,⽽数组的存储⽅式就是静态存储,计算机分配的空间都是你⾃⼰去定义的,后边进⼊链表我们会知道动态存储,你需要多少空间计算机会⾃动按需分配,告别数组的这种静态存储带来的弊端。
⼆.功能函数的声明
void InitList(SqList *LP);//顺序表的初始化
void CreateList(SqList *LP,ElemType a[],int n);//顺序表的创建
void PrintList(SqList *LP);//顺序表的输出
int ListLength(SqList *LP);//顺序表的长度,即当前元素的个数
Status ListInsert(SqList *LP,int i,ElemType e);//顺序表的插⼊操作,在位置i插⼊元素
Status GetElem(SqList *LP,int i,ElemType *e);//顺序表的查操作,返回第i个位置的元素到e中
Status ListDelete(SqList *LP,int i,ElemType *e);//顺序表的删除操作
1.顺序表的初始化
2.顺序表的创建
3.顺序表的输出
4.顺序表的长度,即当前元素的个数
5.顺序表的插⼊操作,在位置i插⼊元素
6.顺序表的查操作,返回第i个位置的元素到e中
7.顺序表的删除操作
以上表⽰7个函数声明分别所代表的意义。
接下来我们需要分别编写这7个功能函数,将对应的接⼝进⾏连接,最后写出主函数,通过主函数实现调⽤,完成整个操作。
三.函数功能的编写
1.线性表的初始化,建⽴了⼀个空表
void InitList(SqList *LP)
{
LP->length=0;
}
2.创建⼀个顺序表
void CreateList(SqList *LP,ElemType a[],int n)
{
int i;
for(i=0;i<n;i++)
{//通过循环将数组元素全部遍历放⼊顺序表中
LP->data[i]=a[i];
LP->length++;
}
}
3.输出线性表
void PrintList(SqList *LP)
{
int i;
printf("\n顺序表中的元素为:\n");
for(i=0;i<LP->length;i++)
printf("%4d",LP->data[i]);
printf("\n\n");
}
4.线性表的当前长度
void ListLength(SqList *LP)
{
return LP->length;
}
5./*==========================================================函数功能的实现:顺序表的运算----元素的插⼊
函数输⼊:顺序表的地址,插⼊值,插⼊位置
函数输出:完成标志--------0:异常 1:正常
============================================================*/
Status ListInsert(SqList *LP,int i,ElemType e)
{
int k;
if(LP->length==MAXSIZE)//顺序表已满
return0;
if(i<1||i>LP->length+1)//插⼊位置⾮法
return0;
for(k=LP->length-1;k>=i-1;k--)//从顺序表最后⼀个元素开始后移
LP->data[k+1]=LP->data[k];
LP->data[i-1]=e;//将插⼊的元素放⼊i-1中
LP->length++;
return1;
}
6./*==========================================================函数功能的实现:顺序表的运算----元素的删除
函数输⼊:顺序表的地址,删除位置,返回删除元素值
函数输出:完成标志--------0:异常 1:正常
============================================================*/
Status ListDelete(SqList *LP,int i,ElemType *e)
{
int k;
if(LP->length==0)
return0;
if(i<1||i>LP->length)
return0;
*e=LP->data[i-1];
for(k=i;k<LP->length;k++)
LP->data[k-1]=LP->data[k];
LP->length--;
return1;
}
7./*==========================================================函数功能的实现:顺序表的运算----元素的查
函数输⼊:顺序表的地址,查位置,接收查值的变量(地址)
函数输出:完成标志--------0:异常 1:正常
============================================================*
Status GetElem(SqList *LP)
{
if(p->length==0||i<1||i>LP->length)
return0;
*e=LP->data[i-1];
return1;
}
四.主函数的编写
int main()
{
SqList L,*SP;
int flag;//⽤于接收函数状态返回或⽤于接收查元素 ElemType result;
int search;
ElemType arr[]={12,14,16,24,28,30,42,77};
c语言listinsert函数SP=&L;
InitList(SP);//初始化线性表
CreateList(SP,arr,8);//创建线性表
PrintList(SP);//输出线性表
printf("顺序表的当前长度为:%d\n",ListLength(SP));
//顺序表中插⼊元素
printf("在第⼏个位置插⼊?\n");
flag=ListInsert(SP,9,90);
if(flag==1)
{
PrintList(SP);
printf("顺序表当前长度为:%d\n\n",ListLength(SP)); }
else
{
printf("顺序表插⼊失败\n");
printf("顺序表的当前长度为:%d\n\n",ListLength(SP)); }
/*顺序表中查元素*/
printf("要查第⼏个元素?\n\n");
scanf("%d",&search);
flag=GetElem(SP,search,&result);
if(flag==1)
printf("第%d个元素是%d\n\n",search,result);
else
printf("顺序表查失败!\n");
/*顺序表的删除操作*/
printf("要删除第⼏个元素?\n");
scanf("%d",&search);
flag=ListDelete(SP,search,&result);
if(flag==1)
printf("删除的第%d个元素是%d\n\n",search,result); else
printf("顺序表删除失败!\n");
return0;
}
五.函数接⼝说明
1. 线性表的初始化
void InitList(SqList *LP);
接⼝1:SqList *LP
含义:线性表的地址。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论