欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺序表的增,删,改,查以及销毁-第十四个程序20200717

程序员文章站 2022-05-09 14:06:01
...
	闲话不多说,直接写代码。
	我用的源程序文件后缀为CPP。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//创建一个存储学生数据(学号、姓名、性别、年龄、成绩)的顺序表,编写顺序表基本功能实现的函数,调用函数对学生数据信息进行管理,对顺序表进行增、删、查、改等操作,并建立简易的操作提示界面
#define size 10
#define maxsize 1024
#define addsize 5
typedef int Type;

struct Student //定义一个学生类型的结构体
{
	Type id;//学生的学号
	char name[20];//学生的名字
	char gender[10];//学生的性别
	Type age;//学生的年龄
	Type score;//学生的成绩
};

struct List //顺序表结构体
{
	Student* pdata;//data指向的是顺序表的首地址
	Type length;//顺序表的首地址
	Type listsize;//顺序表的最大大小
};

//创建空的顺序表
List* createlist()
{
	List* temp = (List*)malloc(sizeof(List));//创建一个单独的空间用来储存顺序表的信息
	temp->pdata = (Student*)calloc(size,sizeof(Student));//开辟size个Student类型的结构体空间用来存放数据
	temp->length = 0;//顺序表长度为0
	temp->listsize = size;//当前顺序表的长度为size
	return temp;//返回指针
}

//在第i个位置插入数据
void insert_data(List*list,Type i,Student data)
{
	//判断要插入的位置是否合法
	if (i<1||i>list->length+1)
	{
		return;
	}
	//如果顺序表内存空间不足,则扩大顺序表内存空间。
	if (list->length>=list->listsize)
	{
		list->pdata = (Student*)realloc(list->pdata, sizeof(Student) * (list->listsize + addsize));
		list->listsize += addsize;
	}
	//从下标i-1的位置把数据向后移动一位
	for (Type j = list->length-1; j >= i-1; j--)//此处j为下标,length和i表示个数,此处可以参考数组的下标的内容
	{
		list->pdata[j+1] = list->pdata[j];
	}
	list->pdata[i-1] = data;//给第i个位置赋值
	list->length++;//顺序表长度加1
}

//查找数据:查找第i个位置上的数据
void search_data(List*list,Type i)
{
	if (i<1||i>list->length)//判断位置是否存在
	{
		printf("您查找的位置不存在!");
		return;//退出当前函数
	}
	else//如果位置存在则显示该位置的内容
	{
		printf("第%d个位置上的数据为: 学号:%d  名字:%s  性别:%s  年龄:%d  成绩:%d\n", i,list->pdata[i - 1].id, list->pdata[i - 1].name, list->pdata[i - 1].gender, list->pdata[i - 1].age, list->pdata[i - 1].score);
	}
}

//修改顺序表中满足条件的数据
void change_data_name(List* list, char*name1,char*name2)
{
	for (Type i = 0; i < list->length; i++)
	{
		if (strcmp(list->pdata[i].name,name1)==0)//满足条件则修改内容
		{
			strcpy(list->pdata[i].name, name2);
		}
	}
}

//删除数据  删除满足条件的名字
void delete_data(List* list, char*name)
{
	for (Type i = 0; i < list->length; i++)
	{
		if (strcmp(list->pdata[i].name, name) == 0)//删除所有满足条件的内容
		{
			for (Type j = i; j < list->length; j++)//删除内容的方法是从要删除的位置开始,将后一个的内容覆盖前一个的内容
			{
				list->pdata[j] = list->pdata[j + 1];
			}
			list->length--;//顺序表长度减一
		}
	}
}

//释放顺序表
void destroy_list(List*list)
{
	if (list!=NULL)
	{
		if (list->pdata!=NULL)
		{
			free(list->pdata);//先释放数据空间
		}
		free(list);//然后释放顺序表信息空间
	}
}

//输出显示
void outlist(List* list)
{
	//如果顺序表为空
	if (list->length==0)
	{
		printf("顺序表内没有内容!");
	}
	else//如果顺序表不为空,则显示顺序表的所有内容
	{
		printf("顺序表的内容为:\n");
		for (Type i = 0; i < list->length; i++)
		{
			printf("学号:%d  姓名:%s  性别:%s  年龄:%d  成绩:%d\n", list->pdata[i].id, list->pdata[i].name, list->pdata[i].gender, list->pdata[i].age, list->pdata[i].score);
		}
	}
}

void run(List*lp)
{
	Type position;
	char name_o[20], name_n[20]; 
	Student data;
	printf("************************\n");
	printf("输入数字 1 表示插入数据\n");
	printf("输入数字 2 表示删除数据\n");
	printf("输入数字 3 表示更改数据\n");
	printf("输入数字 4 表示查询数据\n");
	printf("输入数字 5 表示销毁顺序表\n");
	printf("************************\n");
	printf("请输入一个数字:\n");
	Type key;
	scanf("%d", &key);
	switch (key)
	{
	case 1://插入一个数据
		printf("请输入需要插入数据的位置和学生信息!\n");
		scanf("%d %d %s %s %d %d", &position, &data.id, data.name, data.gender, &data.age, &data.score);
		insert_data(lp, position, data);
		outlist(lp);
		break;
	case 2://删除一个数据
		printf("请输入需要删除的学生的名字\n");
		scanf("%s", name_o);
		delete_data(lp, name_o);
		outlist(lp);
		break;
	case 3://更改一个数据
		printf("请输入需要更改的学生的名字和更改之后的名字!\n");
		scanf("%s %s", name_o, name_n);
		change_data_name(lp, name_o, name_n);
		outlist(lp);
		break;
	case 4://查询一个数据
		printf("请输入需要查询的学生学号!\n");
		scanf("%d", &position);
		search_data(lp, position);
		break;
	case 5://查询一个数据
		destroy_list(lp);
		break;
	}
}

Type main()
{
	List* lp = createlist();
	while (true)
	{
		run(lp);
	}
	system("pause");
	return 0;
}

程序运行结果如下图
顺序表的增,删,改,查以及销毁-第十四个程序20200717
顺序表的增,删,改,查以及销毁-第十四个程序20200717
顺序表的增,删,改,查以及销毁-第十四个程序20200717