对与一个学生来说,存储信息【姓名、年龄、分数,手机号】
功能1:在堆区申请空间,通过尾插添加学生信息
功能2:输入姓名,删除该学生信息
功能3:对学生姓名排序【直接插入排序】
功能4:对年龄按升序排序【快速排序】,并使用折半查找,判断是否存在key年龄的学生
选做【不会做,就把哈希表基础练习一下】
{ 功能5:使用哈希存储以手机号为关键字,实现存储自己定义哈希函数【使用除留取余法】,【链地址法解决哈希冲突】,输入一个手机号查找其他信息 }
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
sequlist *s=Create();
if(s==NULL)
return 0;
int n;
printf("请输入学生的数量:");
scanf("%d",&n);
if(n>MAXSIZE)
return 0;
for(int i=0;i<n;i++)
{
int flag=Insert(s);
if(flag==-1)
printf("插入失败\n");
else
printf("插入成功\n");
}
show(s);
printf("请输入要删除的学生信息:");
char key[20];
scanf("%s",key);
delete(s,key);
printf("对姓名进行直接插入排序:\n");
Insertsort(s,n);
show(s);
int key1;
printf("请输入要查找的学生年龄:");
scanf("%d",&key1);
int flag1=halfsearch(s,0,n-1,key1);
if(flag1==-1)
printf("%d不存在\n",key1);
else
printf("存在,在下标%d处出现",flag1);
printf("对年龄快速排序:\n");
quicksort(s,0,n-1);
show(s);
return 0;
}
text.c
#include "head.h"
sequlist *Create()
{
sequlist *s=(sequlist *)malloc(sizeof(sequlist));
if(s==NULL)
return NULL;
s->len=0;
return s;
}
int Full(sequlist *s)
{
if(s->len==MAXSIZE)
return -1;
return 0;
}
int Empty(sequlist *s)
{
if(s->len==0)
return -1;
return 0;
}
int Insert(sequlist *s)
{
if(Full(s))
return -1;
Student p;
printf("请输入学生姓名:");
scanf("%s",p.name);
printf("请输入学生年龄:");
scanf("%d",&p.age);
printf("请输入学生分数:");
scanf("%f",&p.score);
printf("请输入学生电话号码:");
scanf("%d",&p.phone);
s->data[s->len++]=p;
return 0;
}
void show(sequlist *s)
{
for(int i=0;i<s->len;i++)
{
printf("姓名为%s\t年龄为%d\t成绩为%.2f\t号码为%d\n",s->data[i].name,s->data[i].age,s->data[i].score,s->data[i].phone);
}
}
int search(sequlist *s,char key[])
{
if(Empty(s))
return -1;
for(int i=0;i<s->len;i++)
{
if(strcmp(key,s->data[i].name)==0)
{
return i;
}
}
return -1;
}
void delete(sequlist *s,char key[])
{
int i;
int sub=search(s,key);
if(sub==-1)
{
printf("无法删除\n");
return;
}
for(i=sub;i<s->len-1;i++)
{
s->data[i]=s->data[i+1];
}
printf("删除成功\n");
s->len--;
show(s);
}
void Insertsort(sequlist *s,int n)
{
int i,j;
for(i=1;i<n;i++)
{
Student temp;
temp=s->data[i];
for(j=i-1;j>=0&&strcmp(s->data[j].name,temp.name)>0;j--)
{
s->data[j+1]=s->data[j];
}
s->data[j+1]=temp;
}
}
int halfsearch(sequlist *s,int low,int high,int key)
{
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(key==s->data[mid].age)
{
return mid;
}
else if(key>s->data[mid].age)
{
low=mid+1;
}
else
{
high=mid-1;
}
}
return -1;
}
int onesort(sequlist *s,int low,int high)
{
Student q;
q=s->data[low];
while(low<high)
{
while(low<high&&q.age<=s->data[high].age)
{
high--;
}
s->data[low]=s->data[high];
while(low<high&&q.age>=s->data[low].age)
{
low++;
}
s->data[high]=s->data[low];
}
s->data[low]=q;
return low;
}
void quicksort(sequlist *s,int low,int high)
{
if(low<high)
{
int mid=onesort(s,low,high);
quicksort(s,low,mid-1);
quicksort(s,mid+1,high);
}
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10
typedef struct
{
char name[20];
int age;
float score;
int phone;
}Student;
typedef struct
{
Student data[MAXSIZE];
int len;
}sequlist;
sequlist *Create();
int Full(sequlist *s);
int Insert(sequlist *s);
void show(sequlist *s);
void delete(sequlist *s,char key[]);
int search(sequlist *s,char key[]);
int Empty(sequlist *s);
void Insertsort(sequlist *s,int n);
int onesort(sequlist *s,int low,int high);
void quicksort(sequlist *s,int low,int high);
int halfsearch(sequlist *s,int low,int high,int key);
#endif