查找算法的设计与实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//菜单函数 char Menu(void) { char ch; printf("------------请选择-----------\n"); printf("1.添加学生信息\n2.学生信息排序\n3.查找学生信息\n4.输出学 生信息\n5.更改学生信息\n6.删除学生信息\n0.退出\n----------------------------\n"); scanf(" %c",&ch); return ch; } //添加成员函数 //输入参数:链表头指针 //返回参数:链表头指针 struct Stuff *App(struct Stuff *head) { struct Stuff *p=NULL,*q=head; while(i)
{
p=(struct Stuff *)malloc(sizeof(struct Stuff)); //申请结构体空间 if(p==NULL) { printf("内存不够!\n"); exit(0); } p->next =NULL; //指针域为空 printf("请输入第%d名学生:\n",i); printf(" 编号 | 姓名 | 性别 | 出生年月 | 学历 | 政治面貌 | 电话 | 住址 :\n"); fflush(stdin); scanf("%s",p->number ); if(!strcmp(p->number ,"#")) { free(p); //释放不需要的结构体内存 break; } else { ++i; scanf("%s%s%s%s%s%s%s",p->name ,p->sex ,p->borth ,p->degree ,p->business ,p->phone ,p->place ); p->con[0]='\0'; //防止后面判断出现随机值 if(head==NULL) head=p; else { while(q->next !=NULL) //防止结束后再次输入时出现问题 q=q->next ; q->next =p; } q=p; //每次都加在链表尾 } } return head; } //排序函数 //输入参数:头指针 void Sort(struct Stuff *head) { char ch; struct Stuff *p,*q,*r; while(1) { printf("请选择排序条件:1.编号2.姓名3.性别4.出生年月5.学历6.政治面 貌7.电话8.地址0.退出\n"); scanf(" %c",&ch); if(ch=='0') break;
//交换函数 void Scpy(char *p,char *q) { char c[50]; strcpy(c,p); strcpy(p,q); strcpy(q,c); } //判断函数 //输出参数:1为真,0为假 int Sel(char ch,struct Stuff *p,struct Stuff *q) { switch(ch) //实现各个关键字查找 { case '1': return strcmp(q->number ,p->number )<0||strcmp(q->con ,p>number )==0 ; //排序条件及查找条件 case '2':
if(Sel(ch,p,q)) { printf("学生信息如下:\n"); printf(" 编号 | 姓名 | 性别 | 出生年月 | 学历 | 政治面貌 | 电话 | 住址 \n%s %s %s %s %s %s %s %s\n" ,p->number ,p->name ,p->sex ,p->borth ,p->degree ,p->business ,p->phone ,p->place ); printf("是否需要:1.更改 2.删除 3.继续\n"); scanf(" %c",&sh); if(sh=='1') Chn(head,p->number); //调用更改函数 else if(sh=='2') head=Del(head,p->number); //调用删除函数,得到的head必须 return flag=1; break; } p=p->next ; } if(flag==0) printf("没有找到该学生信息!\n"); } return head; } //更改函数 //输入参数:n[10] 为学生编号 void Chn(struct Stuff *head,char n[10]) { struct Stuff *p=head; int flag=0; if(head==NULL) printf("未找到学生信息!\n"); else { while(p!=NULL) { if(!strcmp(p->number,n)) { printf("请输入新的信息:\n编号|姓名|性别|出生年月|学历|政治面貌| 电话|住址\n"); scanf("%s%s%s%s%s%s%s%s",p->number ,p->name ,p->sex ,p>borth ,p->degree ,p->business ,p->phone ,p->place ); printf("学生信息如下:\n"); flag++; break; } p=p->next; } if(flag==0) printf("未找到该学生信息!\n"); }
1、 测试结果 用户选择界面:
添加信息:
学生信息排序: 学生信息查找:
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <string.h>
2Baidu Nhomakorabea 代码
//清屏函数头文件
struct Stuff { char number[15]; //学生编号 char name[10]; //学生姓名 char sex[8]; //学生性别 char borth[10]; //学生生日 char degree[40]; //学生学历 char business[20]; //学生职务 char phone[15]; //学生电话 char place[50]; //学生住址 char con[50]; //判断关键字专用 struct Stuff *next; }; char Menu(void); //菜单显示 struct Stuff *App(struct Stuff *head); //添加 void Sort(struct Stuff *head); //排序 struct Stuff *Ser(struct Stuff *head); //查找 void Chn(struct Stuff *head,char n[10]); //更改 void Scpy(char *p,char *q); //排序中用于交换员工信息 struct Stuff *Del(struct Stuff *head,char n[10]); //删除 int Sel(char ch,struct Stuff *p,struct Stuff *q); //判断排序及关键字专 用函数 void Prf(struct Stuff *head); //输出 void Fre(struct Stuff *head); //释放 int i=1; //定义全局变量,实现实时学生人数统计 int main(void) { char n[10]; struct Stuff *head=NULL; while(1) { switch(Menu()) {
//链表头指针定义
case '1': printf("请输入学生信息,直接输入'#'结束\n"); head=App(head); break; case '2': Sort(head); break; case '3':
} Fre(head); return 0; }
head=Ser(head); break; case '4': printf("学生信息如下:\n"); Prf(head); break; case '5': printf("请输入学生学号:"); scanf("%s",n); Chn(head,n); break; case '6': printf("请输入学生编号:"); scanf("%s",n); head=Del(head,n); break; case '0': printf("欢迎下次光临,88!\n"); exit(0); default: printf("输入错误,请重新输入!\n"); } fflush(stdin); //清除缓冲区 printf("按任意键继续~"); getchar(); system("cls"); //清屏效果
} }
if(ch<'1'||ch>'8') { printf("输入错误,请重新输入!\n"); continue; } p=head; while(p->next!=NULL) //选择排序 { q=p->next; r=p; while(q!=NULL) { if(Sel(ch,r,q)) //调用判断函数 r=q; q=q->next; } if(r!=p) //交换内容 { Scpy(r->number,p->number); Scpy(r->name,p->name); Scpy(r->sex,p->sex); Scpy(r->borth,p->borth); Scpy(r->degree,p->degree); Scpy(r->business,p->business); Scpy(r->phone,p->phone); Scpy(r->place,p->place); } p=p->next; } Prf(head); //输出
return strcmp(q->name ,p->name )<0||strcmp(q->con ,p->name )==0 ; case '3': return strcmp(q->sex ,p->sex )<0||strcmp(q->con ,p->sex )==0 ; case '4': return strcmp(q->borth ,p->borth)<0 ||strcmp(q->con ,p->borth )==0 ; case '5': return strcmp(q->degree ,p->degree )<0||strcmp(q->con ,p->degree )==0 ; case '6': return strcmp(q->business ,p->business )<0||strcmp(q->con ,p>business)==0 ; case '7': return strcmp(q->phone ,p->phone )<0 ||strcmp(q->con ,p>phone)==0; case '8': return strcmp(q->place ,p->place )<0||strcmp(q->con ,p->place )==0; default : exit(0); } } //查找函数 struct Stuff *Ser(struct Stuff *head) { struct Stuff *p=NULL,*q,a={"\0","\0","\0","\0","\0","\0","\0","\0"}; //防止判断时错误 int flag; //查找判断 char ch,sh; q=&a; while(1) { printf("请输入要查找的条件:1.编号2.姓名3.性别4.出生年月5.学历6.政 治面貌7.电话8.住址0.退出\n"); scanf(" %c",&ch); if(ch=='0') break; if(ch<'1'||ch>'8') { printf("输入错误,请重新输入!\n"); continue; } fflush(stdin); printf("请输入:"); gets(q->con ); p=head; //指向表头 flag=0; while(p!=NULL) {