9.19数据结构-顺序表

顺序表实现一个学生管理系统

1.创建顺序表,制作简易菜单选项

2.循环输入输出学生信息

3.任意位置插入一个学生

4.任意位置删除一个学生

5.任意位置查找一个学生

6.任意位置修改一个学生

7.表头插入一个学生

8.表尾插入一个学生

9.表头删除一个学生

10.表尾删除一个学生

11.去除重复的学生

12.按照姓名查找返回位置(顺序查找算法)

13.按照姓名从小到大排序(冒泡排序)

14.按照学号查找返回位置(二分查找算法实现)

15.按照年龄查找并修改

16.按照学号查找并删除

main.c 

#include "seqlist.h"
void menu(){
	printf("***********************\n");
	printf("***1.任意插 2.任意删***\n");
	printf("***3.任意找 4.任意改***\n");
	printf("***5.表头插 6.表尾插***\n");
	printf("***7.表头删 8.表尾删***\n");
	printf("***9.去除 10.按姓名找**\n");
	printf("****11.按姓名排序******\n");
	printf("***12.按学号找并返回***\n");
	printf("**13.按年龄查找并修改**\n");
	printf("**14.按学号查找并删除**\n");
	printf("*********0.退出*******\n");
}
int main(int argc, const char *argv[])
{
	int input=0;	
	stu e={1374,"细狗","物理",23};			
	stu e1={1245,"黑狗","化学",20};
	stu e2={1345,"舔狗","电子",24};
	int k;
	stu e3={123,"李华","自动化",23};
	//1.创建顺序表
	PList L=Create_List();
	//2.循环输入学生信息
	Input_List(L);
	do{
		menu();
		printf("请选择并输入选项:");
		scanf("%d",&input);
		switch(input){
			case 1:
				//3.任意位置插入一个学生
				Insert_Stu(L,3,e);//第三个位置插入数据
				Output_List(L);//打印所有信息
				break;
			case 2:
				//4.任意位置删除一个学生
				Delete_Stu(L,2);//删除第二个位置学生信息
				Output_List(L);//打印所有信息
				break;
			case 3:
				//5.任意位置查找一个学生
				Insearch_Stu(L,3);//查找第三个位置学生信息
				break;
			case 4:
				//6.任意位置修改一个学生
				Change_Stu(L,3,e1);
				Output_List(L);//打印所有信息
				break;
			case 5:
				//7.表头插入一个学生
				Insert_Front(L,e2);
				Output_List(L);//打印所有信息
				break;
			case 6:
				//8.表尾插入一个学生
				Insert_Rear(L,e2);
				Output_List(L);//打印所有信息
				break;
			case 7:
				//9.表头删除一个学生
				Delete_Front(L);
				Output_List(L);//打印所有信息
				break;
			case 8:
				//10.表尾删除一个学生
				Delete_Rear(L);
				Output_List(L);//打印所有信息
				break;
			case 9:
				//11.去除重复的学生
				Delete_Repeat(L);
				Output_List(L);//打印所有信息
				break;
			case 10:
				//12.按照姓名查找返回位置(顺序查找算法)
				k=Find_Stu(L,"李华");
				if(k==-1){
					printf("查找失败\n");
				}else{
					printf("查找成功,该学生是第%d个位置\n",k);
				}
				break;
			case 11:
				//13.按照姓名从小到大排序(冒泡算法)
				Sort_List(L);
				Output_List(L);//打印所有信息
				break;
			case 12:
				//14.按照学号查找返回位置(对于有序的学号用二分查找算法)
  				k=Binary_Find_Stu(L,1003);
				if(k==-1){
					printf("查找失败\n");
				}else{
					printf("查找成功,该学生是第%d个位置\n",k);
				}
				break;
			case 13:
				//15.按照年龄查找并修改
				Insearch_Stu_Age(L,e3);
				Output_List(L);//打印所有信息
				break;
			case 14:
				//16.按照学号查找并删除
				Insearch_Stu_Id(L,124);
				Output_List(L);//打印所有信息
				break;
			case 0:break;
			default:break;
		}
	}while(input);
	
	return 0;
}

seqlist.c

#include "seqlist.h"
PList Create_List(){
	PList L=(PList)malloc(sizeof(list));
	if(NULL==L){
		perror("malloc lost");
		return NULL;
	}
	L->len=0;//长度初始化为0
	memset(L->data,0,sizeof(stu)*MAX);//数组信息清空
	printf("创建成功\n");
	return L;//返回顺序表地址
}
int Input_List(PList L){
	int n;
	printf("请输入学生个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		if(L->len>MAX){
			break;	
		}
		printf("请输入第%d个学生信息:\n",i+1);
		printf("请输入学号:");
		scanf("%d",&L->data[i].id);
		printf("请输入姓名:");
		scanf("%s",L->data[i].name);
		printf("请输入专业:");
		scanf("%s",L->data[i].major);
		printf("请输入年龄:");
		scanf("%d",&L->data[i].age);
		L->len++;//计数器
	}
	return 0;
}
int Output_List(PList L){
	for(int i=0;i<L->len;i++){
		printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",
				L->data[i].id,L->data[i].name,L->data[i].major,L->data[i].age);
	}
	return 0;
}
int Full(PList L){//判断是否满
	return L->len==MAX;
}
int Insert_Stu(PList L,int post,stu e){
	//判断能不能插入
	int sub=post-1;//下标
	if(sub<0||sub>L->len||L==NULL||L->len==Full(L)){
		perror("Input_Stu error");
		return -1;
	}
	for(int i=L->len-1;i>=sub;i--){
		L->data[i+1]=L->data[i];
	}//腾出要插入的位置,循环移动元素
	L->data[sub]=e;//插入元素
	L->len++;//长度+1
	printf("插入成功\n");
	return 0;
}
int Empty(PList L){
	return L->len==0;
}
int Delete_Stu(PList L,int post){
	int sub=post-1;//下标
	//判断能不能删除
	if(sub<0||sub>L->len-1||L==NULL||Empty(L)){
		perror("Delete_Stu error");
		return -1;
	}
	for(int i=sub;i<L->len;i++){
		L->data[i]=L->data[i+1];
	}//循环往前移动元素,进行覆盖
	L->len--;//长度-1
	printf("删除成功\n");
	return 0;
}
int Insearch_Stu(PList L,int post){
	int sub=post-1;//下标
	//判断能不能查找	
	if(sub<0||sub>L->len-1||L==NULL||Empty(L)){
		perror("Insearch_Stu error");
		return -1;
	}
	printf("该学生存在\n");
	printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",
		L->data[sub].id,L->data[sub].name,L->data[sub].major,L->data[sub].age);
	return 0;
}
int Change_Stu(PList L,int post,stu e){
	int sub=post-1;//下标
	//判断能不能修改	
	if(sub<0||sub>L->len-1||L==NULL||Empty(L)){
		perror("Change_Stu error");
		return -1;
	}
	L->data[sub]=e;
	printf("修改成功\n");
	return 0;
}
int Insert_Front(PList L,stu e){
	//判断能不能头插
	if(L==NULL||Full(L)){
		perror("Insert_Front error");
		return -1;
	}
	for(int i=L->len-1;i>=0;i--){
		L->data[i+1]=L->data[i];
	}
	L->data[0]=e;
	L->len++;
	printf("表头插入成功\n");
	return 0;
}
int Insert_Rear(PList L,stu e){
	//判断能不能尾插
	if(L==NULL||Full(L)){
		perror("Insert_Rear error");
		return -1;
	}
	L->data[L->len]=e;
	L->len++;
	printf("表尾插入成功\n");
	return 0;
}
int Delete_Front(PList L){	
	//判断能不能表头删除
	if(L==NULL||Empty(L)){
		perror("Delete_Front error");
		return -1;
	}
	for(int i=0;i<L->len;i++){
		L->data[i]=L->data[i+1];
	}
	L->len--;
	printf("表头删除成功\n");
	return 0;
}
int Delete_Rear(PList L){
	//判断能不能表尾删除
	if(L==NULL||Empty(L)){
		perror("Delete_Rear error");
		return -1;
	}
	L->data[L->len-1]=L->data[L->len];
	L->len--;
	printf("表尾删除成功\n");
	return 0;
}
int Delete_Repeat(PList L){
	int i,j;
	for(i=0;i<L->len;i++){
		for(j=i+1;j<L->len;j++){
			if(strcmp(L->data[i].name,L->data[j].name)==0){//去除名字重复元素
				Delete_Stu(L,j+1);//调用删除函数去除重复的位置
				j--;//每次删除后元素往前移动了一个单位,避免漏删
			}
		}
	}
	return 0;
}
int Find_Stu(PList L,char *key){
	int i,sub=-1;
	for(i=0;i<L->len;i++){
		if(strcmp(L->data[i].name,key)==0){
			sub=i;//输出最后一个名字相同的下标
		}
	}
	return sub;
}
int Sort_List(PList L){//冒泡算法实现按姓名从小到大排序	
	int i,j,flag=0;
	for(i=0;i<L->len-1;i++){
		for(j=0;j<L->len-1-i;j++){
			if(strcmp(L->data[j].name,L->data[j+1].name)>0){
				stu temp=L->data[j];
				L->data[j]=L->data[j+1];
				L->data[j+1]=temp;
				flag=1;
			}
		}
		if(0==flag){
			break;//若某躺循环没有出现元素交换,表明剩余元素已经有序,则结束剩余趟数循环
		}
		flag=0;
	}
	return 0;
}
int Binary_Find_Stu(PList L,int key){
	int first=0,last=L->len-1;//定义二分查找两头
	while(first<=last){//判断条件为左边下标小于等于右边下标
		int mid=(first+last)/2;//定义中间位置
		if(L->data[mid].id>key){
			last=mid-1;//如果mid位置值比key大,说明在first-mid之间
		}else if(L->data[mid].id<key){
			first=mid+1;//如果mid位置
		}else{
			return mid+1;//找到,返回位置
		}
	}
	return -1;//没找到
}
int Insearch_Stu_Age(PList L,stu e){
	//判断能不能修改	
	if(L==NULL||Empty(L)){
		perror("Insearch_Stu_Age error");
		return -1;
	}
	int sub=-1;
	for(int i=0;i<L->len;i++){
		if(e.age==L->data[i].age){
			L->data[i]=e;
			sub=i;
		}
	}
	if(sub==-1){
		printf("未找到年龄相同的学生,无法修改\n");
	}else{
		printf("修改成功\n");
	}
	return 0;
}
int Insearch_Stu_Id(PList L,int id){
	//判断能不能删除	
	if(L==NULL||Empty(L)){
		perror("Insearch_Stu_Id error");
		return -1;
	}
	int sub=-1;
	for(int i=0;i<L->len;i++){//删除掉所有学号相同的学生信息
		if(id==L->data[i].id){
			sub=i;
		for(int j=sub;j<L->len;j++){
			L->data[j]=L->data[j+1];
		}
		L->len--;
		}
	}
	if(sub==-1){
		printf("未找到学号相同的学生,无法删除\n");
	}else{
		printf("删除成功\n");
	}
	return 0;
}

seqlist.h

#ifndef __LIST__
#define __LIST__
#define MAX 30
#include <myhead.h>
typedef struct{
	int id;
	char name[20];
	char major[20];
	int age;
}stu;//学生信息结构体

typedef struct{//顺序表结构体
	stu data[MAX];//存储学生信息的数组
	int len;//统计学生个数
}list,*PList;
//函数申明
PList Create_List();
int Input_List(PList L);
int Output_List(PList L);
int Full(PList L);
int Insert_Stu(PList L,int post,stu e);
int Empty(PList L);
int Delete_Stu(PList L,int post);
int Insearch_Stu(PList L,int post);
int Change_Stu(PList L,int post,stu e);
int Insert_Front(PList L,stu e);
int Insert_Rear(PList L,stu e);
int Delete_Front(PList L);	
int Delete_Rear(PList L);
int Delete_Repeat(PList L);
int Find_Stu(PList L,char *key);
int Sort_List(PList L);
int Binary_Find_Stu(PList L,int key);
int Insearch_Stu_Age(PList L,stu e);
int Insearch_Stu_Id(PList L,int id);
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值