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

本文介绍了如何使用C语言实现顺序表的基本操作,包括增、删、改、查以及销毁。通过示例代码展示了具体实现过程,并给出了程序运行的结果。
摘要由CSDN通过智能技术生成
	闲话不多说,直接写代码。
	我用的源程序文件后缀为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;
}

程序运行结果如下图
1
2
3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值