/*写几个函数:
1.输入10个职工的姓名和职工号
2.按职工号由小到大的顺序排序,姓名顺序也随之调整
3.要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define N 3
typedef struct sta
{
char c[10];//职工姓名
char num[10];//职工号
struct sta *next;
}sta,*Sta;
//添加节点用于将文件中的信息放入文件中
Sta Add_S(Sta s)
{
Sta p;
p = s;
while(p->next != NULL)
{
p = p->next;
}
p->next = (Sta)malloc(sizeof(sta));
p->next->next = NULL;
return p->next;
}
//把链表信息放入文件中
int savetofile(Sta s)
{
Sta p;
FILE *fp;
p = s->next;
remove("E:/staff.txt");
fp = fopen("E:/staff.txt","w+");
while(p)
{
fwrite(p,sizeof(sta),1,fp);
p = p->next;
}
fclose(fp);
}
//从文件中读取并加载到链表中
int loadtoLink(Sta s)
{
FILE *fp;
Sta p,q;
q = (Sta)malloc(sizeof(sta));
q->next = NULL;
fp = fopen("E:/staff.txt","rb");
while(1)
{
if((fread(q,sizeof(sta),1,fp)) != 0)
{
p = Add_S(s);
strcpy(p->c,q->c);
strcpy(p->num,q->num);
}
else
break;
}
free(q);
fclose(fp);
}
//录入员工信息
Sta Create_S(Sta s)
{
system("title 录入信息");
Sta p,q;
p = s;
while(p->next != NULL)
{
p = p->next;
}
q = (Sta)malloc(sizeof(sta));
printf("请输入职工的姓名:");
gets(q->c);
printf("请输入职工号:");
gets(q->num);
q->next = p->next;
p->next = q;
return s;
}
//按职工号由小到大的顺序排序,姓名顺序也随之调整
Sta Sort_S(Sta s)
{
Sta p,q,t;
Sta min;
int flag;
p = s->next;
t = (Sta)malloc(sizeof(sta));
while(p)
{
flag = 0;
min = p;
q = p->next;
while(q)
{
if(strcmp(min->num,q->num) > 0)
{
min = q;
flag = 1;
}
q = q->next;
}
if(flag == 1)
{
strcpy(t->c,min->c);
strcpy(t->num,min->num);
strcpy(min->c,p->c);
strcpy(min->num,p->num);
strcpy(p->c,t->c);
strcpy(p->num,t->num);
}
p = p->next;
}
return s;
}
//要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名
char *Find_S(Sta s,char num[10],char b[10])
{
Sta p;
int i,j,mid,m,a;
i = 0;
j = N - 1;
while(i <= j)
{
p = s->next;
mid = (i + j) / 2;
for(m = 0;m < mid;m++)
p = p->next;
if(strcmp(p->num,num) < 0)
{
i = mid + 1;
}
if(strcmp(p->num,num) > 0)
{
j = mid - 1;
}
if(!strcmp(p->num,num))
{
strcpy(b,p->c);
return b;
}
}
}
//查看存储信息
int Search_S(Sta s)
{
Sta p;
p = s->next;
printf("职工姓名\t职工号\n");
while (p)
{
printf("%s\t\t",p->c);
printf("%s\n",p->num);
p = p->next;
}
return 1;
}
int main()
{
Sta s;
int i,j;
char b[10] = "\0";
char num[10];
s = (Sta)malloc(sizeof(sta));
s->next = NULL;
loadtoLink(s);
for(i = 0;i < N;i++)
Create_S(s);
printf("职工信息输入结束!\n");
printf("查看职工信息\n");
Search_S(s);
Sort_S(s);
printf("排序结束!\n");
printf("查看职工信息\n");
Search_S(s);
savetofile(s);
printf("请输入一个职工号:");
gets(num);
Find_S(s,num,b);
printf("输出职工姓名:\n");
puts(b);
printf("是否清除文件信息?\n");
printf("1是清除,0是不清除\n");
scanf("%d",&j);
switch(j)
{
case 1:
{
remove("E:/staff.txt");
printf("清除成功!\n");
break;
}
case 0:
{
printf("已收到反馈!\n");
break;
}
}
}
谭浩强C程序设计(第四版)p219第15题
在题目要求的基础上,我添加了可以保存到文件的功能,这样就可以把已经添加的职工信息保存下来,但整个程序还是不健壮的 。
使用结构体完成题目,因为输入的数据全部都是字符型,所以在比较大小的时候要注意规则。
另外,还可以添加很多功能,用纯C语言实现数据库的功能