实验目的:
完成顺序表的基本运算:初始化、显示、求长度、判空、判满、插入、删除、按位置取元素、按值查找等,并编写主函数测试算法。
1.数据结构:用到顺序表数据结构
typedef struct{
int *data; //存储空间的首地址,用于定位顺序表的位置
int length; //顺序表的长度
}SqList;
2.算法描述:
初始化:让顺序表的长度为0;
显示:用for循环依次打印出data[i]的值;
求长度:通过每次的键盘输入,顺序表的长度就+1;
判空:如果顺序表的长度为0,则表示顺序表是空的;
判满:当顺序表的长度等于给定的最大长度时,顺序表是满的;
插入:在某个位置插入时,就将此位置及其以后的值都依次向后移动,从右往左开始移动,注意判断插入位置是否正确,顺序表是否已经占满;
删除:将要删除的位置的下一个位置的元素覆盖此元素,从左到右移动;
按位置取元素:按照指定位置,对应相应的下标,进行取值;
按值查找等:依次比较要查找的值是否与顺序表里面的某个值相等,如果有,返回对应的下标。
3.代码:
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 20 //定义用于存储顺序表的的数组的最大长度
#define OVERFLOW 0 //溢出
#define ERROR 0 //错误
#define OK 1
typedef struct{
int *data; //存储空间的首地址,用于定位顺序表的位置
int length; //顺序表的长度
}SqList;
//初始化
int Init_L(SqList &L){
L.data=(int *)malloc(sizeof(int)*MAXSIZE); //为顺序表分配内存地址
if(!L.data){
exit(OVERFLOW); //内存分配失败,退出
}
L.length=0;
return OK;
}
//将顺序表中填入值,直至敲击回车时结束输入
void filled_L(SqList &L){
int i=0;
int gc;
scanf("%d",&gc);
while(gc!=-1){
L.data[i]=gc;
scanf("%d",&gc);
L.length++;
i++;
}
}
//顺序表的长度
int Len_L(SqList L){
return L.length;
}
//显示顺序表
int Show_L(SqList L){
for(int i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
//判空
int Empty_L(SqList L){
if(L.length==0) printf("It's empty\n");
else printf("It isn't empty\n");
}
//判满
int Full_L(SqList L){
if(L.length==MAXSIZE) printf("It's full\n");
else printf("It isn't full\n");
}
//指定位置插入元素 : 先移动,后插入
int Insert_L(SqList &L,int x,int pos){
int i=0;
if(pos==MAXSIZE+2){ //如果表已满的话,就不能再插入
printf("Sorry,SqList is full\n");
}
if(pos<1 || pos==MAXSIZE+1){ //检查插入位置的合理性,顺序表的两端的前后不能再插入值
printf("Postion is false\n");
}
for(i=L.length-1;i>=pos-1;i--){//从顺序表最后一个元素开始,依次向后移动一个单位,直至空出需要插入的位置,将元素插入
L.data[i+1]=L.data[i];
}
L.data[pos-1]=x; //将元素插入
L.length++; //插入一个元素后,顺序表的长度+1
return OK;
}
//删除某指定元素:从删除的位置后面的元素依次向前覆盖
void Delete(SqList &L,int Del_postion){
for(int i=Del_postion-1;i<=L.length-1;i++){
L.data[i]=L.data[i+1];
}
L.length--;
}
//按位置取元素
int Take_L(SqList &L,int Take_postion){
return L.data[Take_postion-1]; //因为下标从0开始,位置从1开始数数,所以差1
}
//按值查找,遍历顺序表的元素,一一对比
int Search_L(SqList L,int elem){
for(int i=0;i<=L.length-1;i++){
if(elem==L.data[i]) return i+1; //因为位置与下标差 1 ,所以要给下标加 1
}
return ERROR; //没有找到对应的值,返回错误
}
int main(){
SqList L; //将SqList引用为L
int x,number,Ins_postion,Del_postion,Take_postion,Search_positon;
printf("Init SqList..\n");
Init_L(L);
printf("Now please input elements for SqList,press'-1'to return\n");
filled_L(L);
int length=Len_L(L);
printf("The length of SqList is %d\n",length);
printf("The SqList is...\n");
Show_L(L);
Empty_L(L);
Full_L(L);
printf("Insert a number in postion,please input(number,position):");
scanf("%d %d",&number,&Ins_postion);
Insert_L(L,number,Ins_postion);
printf("The SqList is...\n");
Show_L(L);
printf("Delete the number in one postion(position):");
scanf("%d",&Del_postion);
Delete(L,Del_postion);
printf("The SqList is...\n");
Show_L(L);
int take=0;
printf("Input a postion to take a data(postion)\n");
scanf("%d",&Take_postion);
take=Take_L(L,Take_postion);
printf("the data taken is %d\n",take);
int elem=0;
printf("Input a elem to search postion\n");
scanf("%d",&elem);
Search_positon=Search_L(L,elem);
printf("The position is %d\n",Search_positon);
return 0;
}
4.运行结果: