顺序表的增,删,改,查以及销毁-第十四个程序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;
}
程序运行结果如下图