一、问题描述:
顺序表中的基本操作以及描述(基本操作包括对线性表进行初始化,取值,查找元素,插入元素以及删除元素)
二、功能:
(1)初始化线性表:
构造一个空的顺序表,并将表的长度设置为0,具体代码实现如下:
Status InitList(SqList &L){L.elem=new ElemType[MAXSIZE];if(L.elem==NULL) return ERROR;L.length=0;return OK;}
(2)存值
本用例为方便,仅存储5个数据,可以更改循环次数从而增加线性表刚开始存储元素的个数。
利用循环将5个值存入顺序表中,每一次存入都要将表的长度加一,记得形参这里的L一定要使用引
用传递,否则存入后线性表仍然是一个空的线性表
void Creat_n(SqList &L)//参数一定要使用引用{ElemType c;printf("请输入线性表的5个值:\n");for(int i=1;i<=5;i++){scanf("%d",&c);L.elem[i]=c;L.length++;}}
(3)元素的取值
通过输入要取值的元素的位置来进行取值,并将取到的结果赋给同种变量类型e,在这里e同时也要使用引用传递,因为将取到的值赋给变量e后e的值已经发生改变了。同时要对输入的i值(所取元素的位置)进行判断,如果i值合理才能继续进行,否则需要找一个安全出口退出(return ERROR),具体代码如下:
Status GetElem(SqList L,int i,ElemType &e) {if(i<1 || i>L.length) return ERROR;e=L.elem[i];return OK;}
(4)元素的查找
元素的查找要使用逐一对比,从第一个元素开始依次与传进的值e进行对比,如果相同,返回i+1,如果没有与传入元素相同的值,返回0,具体代码实现如下:
int LocateElem(SqList L,ElemType e){for(int i=1;i<=L.length;i++)if(L.elem[i]==e) return i;return 0;}
(5)元素的插入
插入元素首先判断插入的位置是否合理,及(i<1 || i>L.length+1),如果不合理,返回ERROR值,其次要判断该线性表的长度是否已经到达最大值MAXSIZE,如果达到,同样返回值ERROR,当插入位置合适并且线性表的长度没有到达最大值,进行元素的插入,将要插入的位置的后面所有元素依次向后移动一个位置(从后面开始移动),并将该元素插入指定位置,插入后,要将线性表的长度加1,具体代码实现如下:
Status ListInsert(SqList &L,int i,ElemType e){if(i<1 || i>L.length+1) return ERROR;if(L.length==MAXSIZE) return ERROR;for(int j=L.length;j>=i;j--)L.elem[j+1]=L.elem[j];L.elem[i]=e;++L.length;return OK;}
(6)元素的删除
同元素的插入一样,需要判断删除元素的位置是否合理,即(i<1 || i>L.length),但是不需要判断线性表的长度是否已经达到最大值,进行元素的删除时,要将该元素后面的元素一一向前挪动一个位置,删除元素后,要将线性表的长度减1,具体代码实现如下:
Status ListDelete(SqList &L,int i){if(i<1 || i>L.length) return ERROR;for(int j=i+1;j<=L.length;j++)L.elem[j-1]=L.elem[j];--L.length;return OK;}
(7)线性表的展示
线性表的展示直接利用循环遍历线性表中的每一个元素即可,这里的L不需要使用参数传递,因为只是简单的遍历输出元素,没有改变线性表元素的值,具体代码如下:
void Display(SqList L){printf("当前线性表为:\n");for(int i=1;i<=L.length;i++) printf("%d ",L.elem[i]);printf("\n");}
三、整体代码(注释及运行截图)
代码
#include<bits/stdc++.h>using namespace std;#define MAXSIZE 10#define OK 1#define ERROR 0typedef int ElemType;typedef int Status;typedef struct{ElemType *elem;int length; }SqList; //线性表的初始化 Status InitList(SqList &L){L.elem=new ElemType[MAXSIZE];if(L.elem==NULL) return ERROR;L.length=0;return OK;} //线性表的存值void Creat_n(SqList &L){ElemType c;printf("请输入线性表的5个值:\n");for(int i=1;i<=5;i++){scanf("%d",&c);L.elem[i]=c;L.length++;}} //线性表的取值Status GetElem(SqList L,int i,ElemType &e) {if(i<1 || i>L.length) return ERROR;e=L.elem[i];return OK;} //线性表的查找元素int LocateElem(SqList L,ElemType e){for(int i=1;i<=L.length;i++)if(L.elem[i]==e) return i;return 0;} //线性表的插入元素Status ListInsert(SqList &L,int i,ElemType e){if(i<1 || i>L.length+1) return ERROR;if(L.length==MAXSIZE) return ERROR;for(int j=L.length;j>=i;j--)L.elem[j+1]=L.elem[j];L.elem[i]=e;++L.length;return OK;} //线性表的删除元素Status ListDelete(SqList &L,int i){if(i<1 || i>L.length) return ERROR;for(int j=i+1;j<=L.length;j++)L.elem[j-1]=L.elem[j];--L.length;return OK;} //打印线性表void Display(SqList L){printf("当前线性表为:\n");for(int i=1;i<=L.length;i++) printf("%d ",L.elem[i]);printf("\n");} int main(){SqList L;ElemType e;int v,k,opt,p;p=InitList(L);if(p==0) printf("初始化失败!");else{printf("初始化成功\n");printf("请存入5个元素到线性表中\n"); Creat_n(L); printf("1:取出线性表中的某个值\n");printf("2:查找线性表中的元素\n");printf("3:将线性表中插入一个元素\n");printf("4:将线性表中删除一个元素\n");printf("5:展示当前线性表\n");printf("6:退出\n"); while(1){printf("请输入您的选择:");cin>>opt;if(opt==1){//取出线性表中的某个值 printf("请输入要取出值的位置:"); cin>>v;p=GetElem(L,v,e);if(p==0) printf("输入位置非法\n");elseprintf("该值为:%d\n",e); }else if(opt==2){//进行元素的查找printf("请输入您要查找的元素:");cin>>v;k=LocateElem(L,v);if(k==0) printf("输入位置非法\n");elseprintf("您所查找的元素所在位置为:%d\n",k);}else if(opt==3){//线性表元素的插入printf("请输入您要插入的元素及插入的位置:");cin>>v>>k;p=ListInsert(L,k,v);if(p==0) printf("输入位置非法\n");elseDisplay(L);}else if(opt==4){ //线性表元素的删除 printf("请输入您要删除第几个元素:");cin>>v; p=ListDelete(L,v);if(p==0) printf("输入位置非法\n");elseDisplay(L);}else if(opt==5){Display(L);}else if(opt==6){printf("退出成功");break; }}}}
运行截图
三、线性表(顺序表)的优点及缺点分析:
优点:顺序表可以随机存取表中的任一元素
缺点:插入和删除元素过于麻烦,都需要移动大量的数据,操作过程相对复杂,并且会导致存储空间的浪费。