数据结构 建立顺序表存储数据序列作业

题目要求
建立顺序表存储数据序列(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;
}

猜你喜欢

转载自blog.csdn.net/qq_43349548/article/details/106328823