题目要求
建立顺序表存储数据序列(10,20,30,40,50,60,70,80,90,100),要求:
(1)输出顺序表中的所有元素;
(2)输出顺序表中的最大值和最小值;
(3)键盘输入一个数x,如x在表中返回其在表中的位序,不在返回相应提示信息。
(4)删除顺序表中的第8个元素,并输出顺序表中的所有元素;
(5)在第5个元素后面插入新元素55,并输出顺序表中的所有元素;
(6)输出顺序表的长度。
注意
在写代码的过程中出现了报错
是因为在函数中对参数做了引用:
C语言并不支持对函数参数的引用
解决办法:
1.将.c文件直接改成.cpp后缀即可
2.使用指针做函数的参数,达到引用的相同效果
在这里我用的是第一个方法,比较简单
所以我建立的是.cpp文件
定义表结构
typedef struct
{
int data[10];
int length;
}Sqlist;//定义Sqlist这个表结构
初始化顺序表
void initlist(Sqlist *&L)//初始化顺序表,定义结构体指针L
{
L=(Sqlist*)malloc(sizeof(Sqlist));
L->length=0;//初始化结点数量
}
显示顺序表内元素
void showlist(Sqlist *L)
{
int i;
if(L->length==0)
printf("该表为空");
else
{
printf("表内数据:\n");
for(i=0;i<L->length;i++)
printf("%d\n",L->data[i]);
printf("表内有%d个数据\n",L->length);
}
}
插入元素操作
bool insertlist(Sqlist *&L,int i,int e)
{
int j;
if(i>L->length+1||i<1)
return false;
i--;
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
return true;
}
查找最大最小值操作
void Fmaxmin(Sqlist *L)
{
int max=L->data[0],min=L->data[0];
for(int i=0;i<L->length;i++)
{
if(L->data[i]>max)
max=L->data[i];
if(L->data[i]<min)
min=L->data[i];
}
printf("表中最大值为%d\n",max);
printf("表中最小值为%d\n",min);
}
按元素查找序列号,返回int
int selectlist(Sqlist *L,int e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
删除表内数据操作
bool deletelist(Sqlist *&L,int i)
{
int j;
if(i<1||i>L->length)
return false;
i--;
for(j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
printf("表内有%d个数据\n",L->length);
return true;
}
每一步骤都实现具体化,按照题目要求将所有拼装一起在主函数中。
最后完整代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define LEN 10
typedef struct
{
int data[LEN];
int length;
}Sqlist;//定义Sqlist这个表结构
void showlist(Sqlist *L)//显示表内数据
{
int i;
if(L->length==0)//表内为空
printf("该表为空");
else
{
printf("表内数据:\n");
for(i=0;i<L->length;i++)
printf("%d\n",L->data[i]);
printf("表内有%d个数据\n",L->length);
}
}
void initlist(Sqlist *&L)//初始化表结构,定义结构体指针L
{
L=(Sqlist*)malloc(sizeof(Sqlist));
L->length=0;//初始化节点数量
}
bool insertlist(Sqlist *&L,int i,int e)//插入数据
{
int j;
if(i>L->length+1||i<1)//隔空插入或逻辑序号错误
return false;
i--;//逻辑序号转换为物理序号
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
return true;
}
void Fmaxmin(Sqlist *L)//查找最大最小值
{
int max=L->data[0],min=L->data[0];
for(int i=0;i<L->length;i++)
{
if(L->data[i]>max)
max=L->data[i];
if(L->data[i]<min)
min=L->data[i];
}
printf("表中最大值为%d\n",max);
printf("表中最小值为%d\n",min);
}
int selectlist(Sqlist *L,int e)//按e(元素)查找下标返回下标(int)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
bool deletelist(Sqlist *&L,int i)//删除元素操作
{
int j;
if(i<1||i>L->length)
return false;
i--;
for(j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
printf("表内有%d个数据\n",L->length);
return true;
}
void menu()
{
printf("按1实现第一题\n");
printf("按2实现第二题\n");
printf("按3实现第三题\n");
printf("按4实现第四题\n");
printf("按5实现第五题\n");
printf("按6实现第六题\n");
}
int main()
{
Sqlist *L;
int a[LEN]={10,20,30,40,50,60,70,80,90,100};
int e,i=0,flag=0;
initlist(L);
for(i=0;i<10;i++)
insertlist(L,i+1,a[i]);
menu();
while(1){
scanf("%d",&flag);
switch (flag)
{
case 1:showlist(L);break;
case 2:Fmaxmin(L);break;
case 3:
printf("请输入你要查找的数据\n");
scanf("%d",&e);
if(selectlist(L,e)==0)
printf("表中没有你要查找的数据\n");
else
printf("你要查找的数据是表中第%d个元素\n",selectlist(L,e));
break;
case 4:
printf("您要删除第几个元素?\n");
scanf("%d",&i);
deletelist(L,i);
showlist(L);
break;
case 5:
printf("您要插入在哪里插入新元素?\n");
scanf("%d",&i);
printf("您要插入什么元素?\n");
scanf("%d",&e);
insertlist(L,i+1,e);
showlist(L);
break;
case 6:
printf("%d",L->length);
break;
}
}
return 0;
}