#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);
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;
}
#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
#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;
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");
}