顺序表的通讯录管理
对与一个学生来说,存储信息【姓名、年龄、分数,手机号】
功能1:在堆区申请空间,通过尾插添加学生信息
功能2:输入姓名,删除该学生信息
功能3︰对学生姓名排序【直接插入排序】
功能4∶对年龄按升序排序【快速排序】,并使用折半查找,判断是否存在key年龄的学生
选做【不会做,就把哈希表基础练习一下】
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
seqlist *p=createhead();
int n;
printf("\n请输入创建联系人的个数:");
scanf("%d",&n);
Insertbyrear(p,n);
seqlistOutput(p);
//姓名删除
#if 0
char arr[10];
printf("\n请输入姓名以删除信息\n");
scanf("%s",arr);
seqlistdelebyname(p,arr);
seqlistOutput(p);
#endif
#if 0
//对学生姓名排序
printf("\n仅按姓氏排名,无其他含义\n");
Insertsort(p);
seqlistOutput(p);
#endif
//对年龄按升序排序(快速排序,并使用折半查找,判断是否存在key年龄的学生)
int low=0;int high=p->len-1;
quicksort(p,low,high);
seqlistOutput;
int key;
printf("\n请输入查询的年龄:");
scanf("%d",&key);
int flag=seachbyage(p,key);
if(flag==-1)
{
printf("%d不存在",key);
}
printf("%d存在",p->data[flag].age);
return 0;
}
test.c
#include "head.h"
seqlist *createhead()
{
seqlist *p=(seqlist *)malloc(sizeof(seqlist));
if(p==NULL)
return NULL;
p->len=0;
return p;
}
int SeqlistFull(seqlist *p)
{
if(p->len==MAXSIZE)
{
return -1;
}
else
return 0;
}
int seqlistEmpty(seqlist *p)
{
if(p->len==0)
{
return -1;
}
else
return 0;
}
void Insertbyrear(seqlist *p,int n)
{
for(int i=0;i<n;i++)
{
if(SeqlistFull(p))
return;
char name[10];
int age;
int score;
int phone;
printf("\n请输入姓名:");
scanf("%s",name);
printf("\n请输入年龄:");
scanf("%d",&age);
printf("\n请输入分数:");
scanf("%d",&score);
printf("\n请输入号码:");
scanf("%d",&phone);
strcpy(p->data[i].name,name);
p->data[i].age=age;
p->data[i].score=score;
p->data[i].phone=phone;
p->len++;
}
}
void seqlistOutput(seqlist *p)
{
if(seqlistEmpty(p))
return;
int n=p->len;
for(int i=0;i<n;i++)
{
printf("姓名:%s\n",p->data[i].name);
printf("年龄:%d\n",p->data[i].age);
printf("分数:%d\n",p->data[i].score);
printf("号码:%d\n",p->data[i].phone);
printf("\n");
}
}
void seqlistdelebyname(seqlist *p,char name[10])
{
if(seqlistEmpty(p))
return ;
int d=0;
for(int i=0;i<p->len;i++)
{
if(strcmp(p->data[i].name,name)==0)
{
d=i;
}
}
if(d>=1&&d<p->len)
{
for(int i=d;i<=p->len-1;i++)
{
strcpy(p->data[i].name,p->data[i+1].name);
p->data[i].age=p->data[i+1].age;
p->data[i].score=p->data[i+1].score;
p->data[i].phone=p->data[i+1].phone;
}
p->len--;
printf("删除学生%s的信息成功",name);
}
}
void Insertsort(seqlist *p)
{
int n=p->len;int j;
for(int i=1;i<n;i++)
{
char temp[10];int tempa;int temps;int tempp;
strcpy(temp,p->data[i].name);
tempa=p->data[i].age;
temps=p->data[i].score;
tempp=p->data[i].phone;
for( j=i-1;j>0&&strcmp(p->data[j].name,temp)>0;j--)
{
strcpy(p->data[j+1].name,p->data[j].name);
p->data[j+1].age=p->data[j].age;
p->data[j+1].score=p->data[j].score;
p->data[j+1].phone=p->data[j].phone;
}
strcpy(temp,p->data[j+1].name);
p->data[j+1].age=tempa;
p->data[j+1].score=temps;
p->data[j+1].phone=tempp;
}
}
int onesort(seqlist *p,int low,int high)
{
book q;
int temp=p->data[low].age;
q=p->data[low];
while(low<high)
{
while(low<high&&temp<=p->data[high].age)
{
high--;
}
// p->data[low]=p->data[high];
p->data[low].age=p->data[high].age;
while(low<high&&temp>=p->data[low].age)
{
low++;
}
//p->data[high]=p->data[low];
p->data[high].age=p->data[low].age;
}
printf("low=%d\t",low);
//p->data[low]=q;
p->data[low].age=temp;
printf("temp=%d\t",temp);
return low;
}
void quicksort(seqlist *p,int low,int high)
{
int mid;
if(low<high)
{
mid=onesort(p,low,high);
quicksort(p,low,mid-1);
quicksort(p,mid+1,high);
}
}
int seachbyage(seqlist *p,int key)
{
int high=p->len-1;
int low=0;
int mid;
while(low<high)
{
if(key==p->data[mid].age)
return mid;
if(key>p->data[mid].age)
{
low=mid+1;
}
else
{
high=mid-1;
}
}
return -1;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 20
typedef struct
{
char name[10];
int age;
int score;
int phone;
}book;
typedef struct
{
int len;
book data[MAXSIZE];
}seqlist;
seqlist *createhead();
int SeqlistFull(seqlist *p);
int seqlistEmpty(seqlist *p);
void Insertbyrear(seqlist *p,int n);
void seqlistOutput(seqlist *p);
void seqlistdelebyname(seqlist *p,char name[10]);
void Insertsort(seqlist *p);
int onesort(seqlist *p,int low,int high);
void quicksort(seqlist *p,int low,int high);
int seachbyage(seqlist *p,int key);
#endif