我是靠谱客的博主 平淡泥猴桃,这篇文章主要介绍数据结构之线性表的初始化及其操作,现在分享给大家,希望可以做个参考。


文章目录

    • 一.准备工作
    • 二.功能函数的声明
    • 三.函数功能的编写
    • 四.主函数的编写
    • 五.函数接口说明
    • 六.实现思路
TOC]

一.准备工作

1.定义存储空间的分配量

复制代码
1
2
#define MAXSIZE 10

2.定义结果状态函数Status 返回成功失败的状态。

误区:刚开始我把Status理解成了C语言的一个关键字,后来才知道Status是一个用户自定义函数,是定义的一种类型。

用来表示成功或失败的状态。

复制代码
1
2
typedef int Status;//Status是函数的类型

3.定义ElemType 函数类型,需要根据实际情况而定。

typedef为类型定义标识符,作用是为一个数据类型或者结构(比如struct)重新定义一个名称。

所以定义:

复制代码
1
2
typedef int ElemType;

作用是:将关键字int重命名为ElemType

intElemType代表的类型是一样的,声明和定义的变量是等价的

4.通过结构类型来定义顺序表存储类型与定义。

复制代码
1
2
3
4
5
6
7
typedef struct { ElemType data[MAXSIZE]; int length; }SqList;

以上顺序表类型的定义【初始化】的含义:

为顺序表分配一个容量为MAXSIZE大小的数组空间,数组名为data ,并将线性表的当前长度length设为0.

[注意点]:

复制代码
1
2
为什么用数组来对线性表进行存储?

顺序表的定义:用一组地址连续的存储单元依次存储线性表的各个数据元素,即用顺序存储的线性表

   它采用的数据元素存储方式是静态存储,这种方式还是有很多缺点的,因为你不知道自己实现到底需要计算机分配多少空间,在编程活动中,特别是我们的小学期中,很多同学出现了溢出或空间不够的现象,也就是传说中的“烫烫”,而数组的存储方式就是静态存储,计算机分配的空间都是你自己去定义的,后边进入链表我们会知道动态存储你需要多少空间计算机会自动按需分配,告别数组的这种静态存储带来的弊端。


二.功能函数的声明

复制代码
1
2
3
4
5
6
7
8
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.线性表的初始化,建立了一个空表

复制代码
1
2
3
4
5
void InitList(SqList *LP) { LP->length=0; }

2.创建一个顺序表

复制代码
1
2
3
4
5
6
7
8
9
10
void CreateList(SqList *LP,ElemType a[],int n) { int i; for(i=0;i<n;i++) {//通过循环将数组元素全部遍历放入顺序表中 LP->data[i]=a[i]; LP->length++; } }

3.输出线性表

复制代码
1
2
3
4
5
6
7
8
9
void PrintList(SqList *LP) { int i; printf("n顺序表中的元素为:n"); for(i=0;i<LP->length;i++) printf("%4d",LP->data[i]); printf("nn"); }

4.线性表的当前长度

复制代码
1
2
3
4
5
void ListLength(SqList *LP) { return LP->length; }

5./*==========================================================
函数功能的实现:顺序表的运算----元素的插入
函数输入:顺序表的地址,插入值,插入位置
函数输出:完成标志--------0:异常 1:正常

============================================================*/

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Status ListInsert(SqList *LP,int i,ElemType e) { int k; if(LP->length==MAXSIZE)//顺序表已满 return 0; if(i<1||i>LP->length+1)//插入位置非法 return 0; 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++; return 1; }

6./*==========================================================
函数功能的实现:顺序表的运算----元素的删除
函数输入:顺序表的地址,删除位置,返回删除元素值
函数输出:完成标志--------0:异常 1:正常

============================================================*/

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Status ListDelete(SqList *LP,int i,ElemType *e) { int k; if(LP->length==0) return 0; if(i<1||i>LP->length) return 0; *e=LP->data[i-1]; for(k=i;k<LP->length;k++) LP->data[k-1]=LP->data[k]; LP->length--; return 1; }

7./*==========================================================
函数功能的实现:顺序表的运算----元素的查找
函数输入:顺序表的地址,查找位置,接收查找值的变量(地址)
函数输出:完成标志--------0:异常 1:正常

============================================================*

复制代码
1
2
3
4
5
6
7
8
Status GetElem(SqList *LP) { if(p->length==0||i<1||i>LP->length) return 0; *e=LP->data[i-1]; return 1; }

四.主函数的编写

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
int main() { SqList L,*SP; int flag;//用于接收函数状态返回或用于接收查找元素 ElemType result; int search; ElemType arr[]={12,14,16,24,28,30,42,77}; SP=&L; InitList(SP);//初始化线性表 CreateList(SP,arr,8);//创建线性表 PrintList(SP);//输出线性表 printf("顺序表的当前长度为:%dn",ListLength(SP)); //顺序表中插入元素 printf("在第几个位置插入?n"); flag=ListInsert(SP,9,90); if(flag==1) { PrintList(SP); printf("顺序表当前长度为:%dnn",ListLength(SP)); } else { printf("顺序表插入失败n"); printf("顺序表的当前长度为:%dnn",ListLength(SP)); } /*顺序表中查找元素*/ printf("要查找第几个元素?nn"); scanf("%d",&search); flag=GetElem(SP,search,&result); if(flag==1) printf("第%d个元素是%dnn",search,result); else printf("顺序表查找失败!n"); /*顺序表的删除操作*/ printf("要删除第几个元素?n"); scanf("%d",&search); flag=ListDelete(SP,search,&result); if(flag==1) printf("删除的第%d个元素是%dnn",search,result); else printf("顺序表删除失败!n"); return 0; }

五.函数接口说明

  1. 线性表的初始化
复制代码
1
2
void InitList(SqList *LP);

接口1:SqList *LP
含义:线性表的地址。

  1. 线性表的创建
复制代码
1
2
void InitList(SqList *LP);//顺序表的初始化

接口1:SqList *LP
含义:线性表的地址。

  1. 线性表的输出
复制代码
1
2
void PrintList(SqList *LP);//顺序表的输出

接口1:SqList *LP
含义:线性表的地址。

  1. 线性表的当前长度
复制代码
1
2
int ListLength(SqList *LP);//顺序表的长度,即当前元素的个数

接口1:SqList *LP
含义:线性表的地址。

  1. 线性表的插入操作
复制代码
1
2
Status ListInsert(SqList *LP,int i,ElemType e);//顺序表的插入操作,在位置i插入元素

接口1:SqList *LP线性表的地址
接口2:int i插入的位置
接口3:ElemType e插入的新元素值

  1. 线性表的查找操作
复制代码
1
2
Status GetElem(SqList *LP,int i,ElemType *e);//顺序表的查找操作,返回第i个位置的元素到e中

接口1:SqList *LP线性表的地址
接口2:int i查找到的位置
接口3:ElemType *e返回元素值

  1. 线性表的删除操作
复制代码
1
2
Status ListDelete(SqList *LP,int i,ElemType *e);//顺序表的删除操作

接口1:SqList *LP线性表的地址
接口2:int i要删除的位置
接口3:ElemType *e获得的删除值


六.实现思路

代码流程图


最后

以上就是平淡泥猴桃最近收集整理的关于数据结构之线性表的初始化及其操作的全部内容,更多相关数据结构之线性表内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(137)

评论列表共有 0 条评论

立即
投稿
返回
顶部