数据结构C语言——顺序表
一、实验目的
1.掌握线性表的存储结构及相关的操作;
2.熟悉对顺序表的一些基本操作,如初始化、插入、删除等;
3.用C语言编制程序,程序中写出详细注释;
4.给出测试结果,验证程序的正确性。
二、实验内容
1.建立一个长度为N的顺序表。
2.输出该顺序表的各个元素以及相应的下标。
3.在顺序表的第i个位置里插入元素x,并且输出插入元素后顺序表中各个元素以及相应的下标。
4.删除顺序标中第i个位置的元素,并且输出删除元素后顺序表中各个元素以及相应的下标。
5.在顺序表中找到x元素,并且返回该元素的位置,如果没有找到该元素x,则输出“顺序表中没有该元素”。
*6.输出该顺序标中的最大值m和次最大值n。
*7.初始化(清空)该顺序表中的所有元素。
顺序表代码
#include<stdio.h>
#include<stdlib.h> //包含了创建顺序表所需的malloc()函数和realloc()函数
typedef float ElemType ; //自定义int类型变量的别名ElemType
#define MAXSIZE 100 //表的最大长度
typedef struct { //定义顺序表的结构体变量
ElemType *data;
int length;//记录顺序表数据个数
int initsize; //顺序表总长
}sqlist;
//2.建立一个长度为N的顺序表
void create(sqlist *L) //创建一个长度为n的顺序表
{
int n;
printf("请输入你需要的顺序表长度:(输入0创建空表)\n");
scanf("%d", &n);
L->data = (ElemType *)malloc(sizeof(ElemType)*n);//申请长度n的储存空间
L->length = 0;
L->initsize = MAXSIZE;
if (n == 0)
{
L->length = 0;
printf("创建了一个空表!\n");
}
else if (n > L->initsize)
printf("需要的长度超出总长!请重新输入所需长度!!!\n");
else if(n!=0)
{
printf("请输入顺序表里的数据(请输入数值,忽输入其他字符)\n");
for (int i = 0;i <n;i++)
{
scanf("%f", &L->data[i]);
L->length++;
}
printf("顺序表创建成功!\n");
}
}
//3.求表长操作
int getlen(sqlist *L)
{
return(L->length);
}
//4.输出
void output(sqlist *L)
{
int i;
if(L->length==0)
{
printf("这是一个空表!!!没有数据\n");
}
else
{
for(i=0;i<L->length;i++)
{
printf("第%d个数据为%.5f\n",i+1,L->data[i]);
}
}
}
//5.插入
void insert(sqlist *L)
{
int i,j;
float x;
printf("请输入插入位置:");
scanf("%d",&i);
system("cls");
if(i<1||i>L->length+1)
{
printf("输入i过小或过大\n");
}
else
{
while(L->length ==L->initsize)
{
L->data=(ElemType*)realloc(L->data,(L->initsize+1)*sizeof(ElemType));//重置空间大小
L->initsize++;
}
printf("请输入插入数据:");
scanf("%f",&x);
for(j=L->length-1;j>=i-1;j--)//数组下标012345
{
L->data[j+1]=L->data[j];
}
L->data[i-1]=x;
L->length++;
printf("插入成功\n");
}
}
//6.删除操作
void cancel(sqlist *L)
{
int i,j,k=1;
if(L->length==0)
{
printf("这是一个空表!!!没有数据,请重新输入!!!\n");
}
else
{
while(k==1)
{
printf("请输入要删除的第几位数据:\n");
scanf("%d",&i);
if(i>L->length||i<1)
{
printf("没有这个数据,请重新输入:");
}
else if(i<=L->length&&i>=1)
{
k=2;
for(j=i;j<=L->length;j++)
{
L->data [j-1]=L->data[j];
}
L->length--;
printf("删除成功");
}
}
}
}
//7.查找数据
void search(sqlist *L)
{
int i,j=0,k=L->length;
float x;
if(L->length==0)
{
printf("这是一个空表!!!没有数据,请重新输入!!!\n");
}
else
{
printf("请输入要查询的数据:");
scanf("%f",&x);
for(i=0;i<L->length;i++)
{
if(x==L->data[i])
{
printf("该数据在第%d位\n",i+1);
}
else if(x!=L->data[i])
{
j++;
if(k==j)
{
printf("没有这个数据\n");
}
}
}
}
}
//8.查找max,imax
void searchmax(sqlist *L)
{
int i,j;
float a=0.0;
if(L->length==0)
{
printf("这是一个空表!!!没有数据,请重新输入!!!\n");
}
else
{
for(i=0;i<L->length-1;i++)
{
for(j=i+1;j<L->length;j++)
{
if(L->data[i]<L->data [j])
{
a=L->data [i];
L->data [i]=L->data [j];
L->data [j]=a;
}
}
}
printf("最大值为%.5f\n次最大值为%.5f",L->data [0],L->data [1]);
}
}
//9.建立一个空表
void create2(sqlist *L) //创建一个长度为n的顺序表
{
int n=0;
L->data = (ElemType *)malloc(sizeof(ElemType)*n);//申请长度n的储存空间
L->length = 0;
L->initsize = MAXSIZE;
printf("创建了一个空表!\n");
}
int main()
{
sqlist L;
int a,k;
char b;
create2(&L);
while(k=1)
{
printf("顺序表作业\n");
printf("------------------------\n");
printf("功能表选择\n");
printf("------------------------\n");
printf("a.创立\nb.查看表长\nc.输出数据\nd.插入数据\ne.删除数据\nf.查询数据\ng.比较\nh.清空\n");
printf("请输入功能:");
scanf("%c",&b);
switch(b)//要用abc作为选项,不能用123
{
case 'a':create(&L);
system("pause");
break;
case 'b':a=getlen(&L);
printf("表长=%d\n",a);
system("pause");
break;
case 'c':output(&L);
system("pause");
break;
case 'd':insert(&L);
system("pause");
break;
case 'e':cancel(&L) ;
system("pause");
break;
case 'f':search(&L);
system("pause");
break;
case 'g': searchmax(&L) ;
system("pause");
break;
case 'h':create2(&L); //清空
system("pause");
break;
}
system("cls");//清屏
}
return 0;
}