2023-2-9学生信息管理

在这里插入图片描述

//main.c
#include "head.h"
int main(int argc, const char *argv[])
{
	printf("id为学生的唯一标识,不会重复\n");
	printf("按年龄排序后折半查找只能返回第一个符合条件的值\n");
	Seqlist *l = Create();
	while(1){
		printf("================\n");
		printf("1.尾插插入学士信息\n");
		printf("2.输入姓名,删除对应学生信息\n");
		printf("3.顺序表打印\n");
		printf("4.按学生姓名排序\n");
		printf("5.年龄升序排序,并按年龄查找\n");
		printf("6.哈希存储,按手机号查询\n");
		printf("7.退出系统\n");
		printf("================\n");
		int res;
		printf("请输入序号:");
		scanf("%d",&res);
		if(res==7)
			break;
		switch(res){
			case 1:{InsertRear(l);break;}
			case 2:{DeleteByName(l);printf("删除操作执行后学生信息如下:\n");Show(l);break;}
			case 3:{printf("当前学生信息如下:\n");Show(l);break;}
			case 4:{SortByName(l);printf("姓名排序后学生信息如下:\n");Show(l);break;}
			case 5:{QuickSort(l,0,l->len-1);printf("年龄排序后学生信息如下:\n");Show(l);SeachByAge(l);break;}
			case 6:{
					printf("请输入待查找的手机号码:");
					int phone;
					int hashlen;
					scanf("%d",&phone);
					for(int i=l->len*4/3;i>=1;i--){
						int flag = 0;
					for(int j=2;j<i;j++){
						if(i%j==0){
							flag = 1;
							break;
					}
					}
					if(flag == 0){
						hashlen = i;
						break;
					}
					}
					Node hash[hashlen];
					for(int i=0;i<hashlen;i++){
					hash[i]=NULL;
					}
					InsertHash(hash,l,hashlen);
					HashSearch(hash,phone,hashlen);
					//hash空间释放
					for(int i=0;i<hashlen;i++){
						while(hash[i]!=NULL){
							Node p = hash[i];
							hash[i] = p->next;
							free(p);
							p=NULL;
						}
					}
					break;
                    }
			default:{printf("输入序号错误,请重新输入\n");}
			 }	
		}
		//顺序表空间释放
		free(l);
		l=NULL;
	return 0;
}
//head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct
{
	int id;
	char name[20];
	int age;
	float score;
	char phone[20];
}Student;
typedef struct
{
	int len;
	Student data[MaxSize];
}Seqlist;
typedef struct node
{
	Student s;
	struct ndoe *next;
}*Node;
Seqlist *Create();
void InsertRear(Seqlist *l);
void Show(Seqlist *l);
void DeleteByName(Seqlist *l);
void SortByName(Seqlist *l);
void QuickSort(Seqlist *l,int low,int high);
int quick(Seqlist *l,int low,int high);
void InsertHash(Node hash[],Seqlist *l,int hashlen);
void HashSearch(Node hash[],int phone,int hashlen);
void SeachByAge(Seqlist *l);
#endif
//test.c
#include "head.h"
Seqlist *Create()
{
	Seqlist *l = (Seqlist *)malloc(sizeof(Seqlist));
	if(l==NULL)
		return NULL;
	l->len = 0;
	return l;
}
void InsertRear(Seqlist *l)
{
	if(l==NULL){
		printf("结构体指针创建失败,插入失败\n");
		return ;
	}
	if(l->len==MaxSize){
		printf("顺序表满,插入失败\n");
		return ;
	}
	Student s;
	printf("请输入学生id:");
	scanf("%d",&s.id);
	for(int i=0;i<l->len;i++){
		if(l->data[i].id==s.id){
			printf("该学生信息已存在,请勿重复插入\n");
			return;
		}
	}
	printf("请输入学生姓名:");
	scanf("%s",s.name);
	printf("请输入学生年龄:");
	scanf("%d",&s.age);
	printf("请输入学生分数:");
	scanf("%f",&s.score);
	printf("请输入学生电话号码:");
	scanf("%s",s.phone);
	l->data[l->len++] = s;
}
void Show(Seqlist *l)
{
	for(int i=0;i<l->len;i++){
		printf("学生的id为:%d,姓名为:%s,年龄为:%d,分数为:%.2f,电话号码为:%s\n",l->data[i].id,l->data[i].name,l->data[i].age,l->data[i].score,l->data[i].phone);
	}
}
void DeleteByName(Seqlist *l)
{
	printf("请输入要删除的学生姓名:");
	char name[20];
	scanf("%s",name);
	int len = l->len;
	int i=0;
	while(i<len){
		if(strcmp(l->data[i].name,name)==0){
			for(int j=i+1;j<=l->len;j++){
				l->data[j-1] = l->data[j];
			}
			l->len--;
			i--;
		}
		i++;
	}
}
void SortByName(Seqlist *l)
{
	int i,j;
	for(i=1;i<l->len;i++){
		Student temp = l->data[i];
		for(j=i-1;j>=0&&strcmp(temp.name,l->data[j].name)<0;j--){
			l->data[j+1] = l->data[j];
		}
		l->data[j+1] = temp;
	}
}
void QuickSort(Seqlist *l,int low,int high)
{
	if(low<high){
		int mid = quick(l,low,high);
		QuickSort(l,low,mid-1);
		QuickSort(l,mid+1,high);
	}
}
int quick(Seqlist *l,int low,int high)
{
	Student key = l->data[low];
	while(low<high){
		while(low<high&&key.age<=l->data[high].age){
			high--;
		}
		l->data[low] = l->data[high];
		while(low<high&&key.age>=l->data[low].age){
			low++;
		}
		l->data[high] = l->data[low];
	}
	l->data[high] = key;
	return high;
}

void InsertHash(Node hash[],Seqlist *l,int hashlen)
{
	for(int i=0;i<l->len;i++){
		Node p =(Node)malloc(sizeof(struct node));
		if(p==NULL)
			return ;
		p->s = l->data[i];
		p->next = NULL;
		int num=0;//phone转为int类型
		char *q = l->data[i].phone;
		while(*q!='\0'){
			num  = num*10+(*q-'0');
			q++;
		}
		int sub = num%hashlen;
		p->next = hash[sub];
		hash[sub] = p;
	}
}
void HashSearch(Node hash[],int phone,int hashlen)
{
	int sub = phone%hashlen;
	int flag = 0;
	Node p = hash[sub];
	while(p){
		int sum = 0;
		char *q = p->s.phone;
		while(*q){
			sum=sum*10+*q-'0';
			q++;
		}
		if(sum==phone){
			flag = 1;
			printf("查询到的姓名为%s,id为:%d,年龄为:%d,电话为:%s\n",p->s.name,p->s.id,p->s.age,p->s.phone);
		}
		p = p->next;
	}
	if(flag==0){
	printf("查找不到,未含有此人信息!\n");
	}
}
void SeachByAge(Seqlist *l)
{
	int age;
	printf("请输入要查询的年龄:");
	scanf("%d",&age);
	int mid;
	int low = 0;
	int high = l->len-1;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(age==l->data[mid].age)
		{
		printf("查询到的姓名为%s,id为:%d,年龄为:%d,电话为:%s\n",l->data[mid].name,l->data[mid].id,l->data[mid].age,l->data[mid].phone);	
			return;
		}
		else if(age>l->data[mid].age)
		{
			low=mid+1;
		}
		else{
			high=mid-1;
		}
	}
	printf("未含有该年龄的学生信息\n");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值