s=p->next;
p->next=q;
q->next=s;
break;
}
}
elseif(strcmp(p->name,x.name)<0&&p->next==NULL){
//不断先后查找,当找到最后一个节点的时候,并且前面所有的name值都小于数据X里name值,把节点插入到链表最后
p->next=q;
q->next=NULL;
break;
}
if(strcmp(p->name,x.name)>0){
//后面所以节点name的值都比数据X里name值大,就把节点插入后指针后,即所以链表节点前
s=head->next;
head->next=q;
q->next=s;
break;
}
}
}
//
returnhead;
}
voidListDelete(SLNode*head)
{
//此函数的功能是删除链表中特定的节点,以职员name为关键字
SLNode*p,*s;
charx[20];
s=head;
p=head->next;
if(head->next==NULL){
//当链表中无节点时,给出提示信息
printf("名单中无职工信息,无须删除!
\n");
return;
}
printf("请输入要删除职工的姓名:
\n");
//获得要删除的节点的name的值
scanf("%s",x);
for(p;p;p=p->next){
//然后不断的往后找,知道节点里的name的值,等于输入的name的值的时候,就退出此for循环,,用break语句
if(strcmp(p->name,x)==0){
//找到后,要删除节点的前面节点指向要删除节点的后面节点
s->next=p->next;
free(p);//然后释放要删除节点的内存空间
printf("删除成功!
请继续操作!
\n");
//break,退出for循环
break;
}
s=p;
}
if(p==NULL){
//如果没有找到要删除的节点,则提示信息
printf("名单中无职工信息,无须删除!
\n");
}
}
voidListxiugai(SLNode*head)
{
//此函数为修改指定的节点,以职员name为关键字,
DataTypex;
SLNode*p;
p=head->next;
if(p==NULL){
//当链表中无节点时,给出提示信息
printf("职工名单无职工信息,无须修改!
\n");
return;
}
printf("请输入要修改的职工姓名:
\n");
//获得要修改的节点的name的值
scanf("%s",x.name);
printf("依次写入该职工的信息:
\n");
for(;p;p=p->next)
{
//不断往后找,直到找到要修改的节点,让后通过scanf获得用户重新输入的各属性值,再重新赋值给要修改的节点P
if(strcmp(x.name,p->name)==0){
scanf("%s%c%d%d%s%s%s%d",p->name,&p->sex,&p->chusheng,&p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,&p->dianhua);
break;
}
}
if(p==NULL)
//如果没有找到要修改的节点,则提示信息
printf("此职工不存在,无法修改其信息!
\n");
printf("修改成功!
请继续操作!
\n");
}
voidput(SLNode*head,FILE*fp)
{
//此函数的功能是将,链表中节点的值,打印到worker.txt文件中
SLNode*p;
//打开要输入信息的文件
if((fp=fopen("worker.txt","w"))==NULL){
//如果没有打开,则提示错误信息
printf("无法打开‘worker.txt’!
\n");
exit(0);
}
for(p=head->next;p;p=p->next)
{
//通过for循环,不断的将链表节点信息输入到文件中
fprintf(fp,"%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
//输入信息成功后,关闭打开的文件
if(fclose(fp)){
//如果关闭失败,则提示错误信息
printf("无法关闭‘worker.txt’!
\n");exit(0);
}
}
voidListfind(SLNodehead)
{
//此函数的功能是,寻找特定职员的信息
inti;
SLNode*p;
DataTypex;
if(head.next==NULL){
//如果没有链表节点,则提示信息
printf("名单中无职工信息,无法查询!
\n");
return;
}
//打印出一段字符,提示用户,输入不同的数字,来执行不同的操作
printf("0.退出查询系统,回到主菜单\n1.对姓名进行查询\n2.对出生年月进行查询\n3.对工作年月进行查询\n4.对学历进行查询\n5.对职务进行查询\n6.对住址进行查询\n7.对电话号码进行查询\n");
for(;;)
{
//一个空的for循环,来不断的接受用户的查询,当用户输入时,在通过break语句退出此for循环
//得到用户要操作的数字,通过这个数字的不同来执行不同的查询操作
scanf("%d",&i);
if(i==0)
//如果用户输入,则退出for循环,也就是退出查询
break;
if(i==1){
//输入,按姓名查询
p=head.next;
printf("请输入姓名:
");
scanf("%s",x.name);
i=0;
for(p;p;p=p->next){
//通过用户输入的name值,来查询链表各节点中name的值,如相同,则打印到屏幕上
if(strcmp(p->name,x.name)==0){
++i;//设置一个i值,来判断,有木有查询到所要查询的员工信息
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
}
if(i==0)
//i=0,说明没有查询到要查询的员工信息,则提示信息
printf("职工名单中不存在此人!
\n");
//否则说明,查询成功,即给出提示信息
elseprintf("查询成功!
请继续操作!
\n");
}
/*下面的程序和上面的程序一样,只是通过获得不同的i值,来通过不同的关键字来查询
,当i=1.对姓名进行查询i=2.对出生年月进行查询i=3.对工作年月进行查询i=4.对学历进行查询i=5.对职务进行查询i=6.对住址进行查询
i=7.对电话号码进行查询,,,所以,下面的程序就不解释啦*/
if(i==2){
p=head.next;
printf("请输入出生年月:
");
scanf("%d",&x.chusheng);
i=0;
for(p;p;p=p->next){
if(p->chusheng==x.chusheng){
++i;
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
}
if(i==0)
printf("职工名单中没有这个时间出生的!
\n");
elseprintf("查询成功!
请继续操作!
\n");
}
if(i==3){
p=head.next;
printf("请输入工作年月:
");
scanf("%d",&x.gongzuo);
i=0;
for(p;p;p=p->next){
if(p->gongzuo==x.gongzuo){
++i;
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
}
if(i==0)
printf("职工名单中没有这个时间工作的!
\n");
elseprintf("查询成功!
请继续操作!
\n");
}
if(i==4){
p=head.next;
printf("请输入学历:
");
scanf("%s",x.xueli);
i=0;
for(p;p;p=p->next){
if(strcmp(p->xueli,x.xueli)==0){
++i;
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
}
if(i==0)
printf("职工名单中没有这种学历的!
\n");
elseprintf("查询成功!
请继续操作!
\n");
}
if(i==5){
p=head.next;
printf("请输入职务:
");
scanf("%s",x.zhiwu);
i=0;
for(p;p;p=p->next){
if(strcmp(p->zhiwu,x.zhiwu)==0){
++i;
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
}
if(i==0)
printf("职工名单中没有这种职务的!
\n");
elseprintf("查询成功!
请继续操作!
\n");
}
if(i==6){
p=head.next;
printf("请输入住址:
");
scanf("%s",x.zhuzhi);
i=0;
for(p;p;p=p->next){
if(strcmp(p->zhuzhi,x.zhuzhi)==0){
++i;
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
}
if(i==0)
printf("职工名单中没有住这的!
\n");
elseprintf("查询成功!
请继续操作!
\n");
}
if(i==7){
p=head.next;
printf("请输入电话:
");
scanf("%d",&x.dianhua);
i=0;
for(p;p;p=p->next){
if(p->dianhua==x.dianhua){
++i;
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
}
if(i==0)
printf("职工名单中没人用这个号码!
\n");
elseprintf("查询成功!
请继续操作!
\n");
}
//如果用户输入i的值,不是我们提示的值,则给出用户错误信息,并让用户重新输入
if(i!
=0&&i!
=1&&i!
=2&&i!
=3&&i!
=4&&i!
=5&&i!
=6&&i!
=7)
printf("输入出错!
请再次输入!
\n");
}
}
voidprint(SLNode*head)
{
//此函数,是打印出链表中的所有员工的信息
for(SLNode*p=head->next;p;p=p->next)
printf("%s%c%d%d%s%s%s%d\n",p->name,p->sex,p->chusheng,p->gongzuo,p->xueli,p->zhiwu,p->zhuzhi,p->dianhua);
}
voidListpaixu(SLNode*head)
{
//此函数,是对职员信息来排序,,
inti,n=0,m,flag=1;
SLNode*p,*q,*s;
if(head->next==NULL){
printf("名单中无职工信息,无法排序!
\n");
return;
}
printf("0.退出排序系统,回到主菜单\n1.对性别进行排序\n2.对出生年月进行排序\n3.对工作年月进行排序\n");
for(;;)
{
scanf("%d",&i);
if(i==0)
break;
//通过用户输入值的不同,来对节点不同的信息进行排序
if(i==1){
n=0,m,flag=1;
for(p=head;NULL!
=p;p=p->next)
//或的链表节点的数目
n++;
for(m=1;flag&&m<=n;n++)
{
flag=0;
for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next)
{
//采用冒泡排序法来对链表进行排序
if(p->sex>q->sex)
{
//如果前面节点sex大于后面的sex,则交换二节点的位置
if(head==p)
{
//判断p是否为头指针,来进行不同的操作
head->next=q->next;
head=q;
q->next=p;
q=head->next;
p=head;
}
else
{
p->next=q->next;
q->next=p;
s->next=q;
p=q;
q=p->next;
}
flag=1;
}
}
}
printf("排好序的信息如下:
\n");
//排序成功后,打印出排序好的职员信息,通过调用print()函数来实现
print(head);
}
/*下面的程序和上面的程序一样,只是通过获得不同的i值,来通过不同的关键字来排序,所以,下面的程序就不解释啦*/
if(i==2){
n=0,m,flag=1;
for(p=head;NULL!
=p;p=p->next)
n++;
for(m=1;flag&&m<=n;n++)
{
flag=0;
for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next)
{
if(p->chusheng>q->chusheng)
{
if(head==p)
{
head->next=q->next;
head=q;
q->next=p;
q=head->next;
p=head;
}
else
{
p->next=q->next;
q->next=p;
s->next=q;
p=q;
q=p->next;
}
flag=1;
}
}
}
printf("排好序的信息如下:
\n");
print(head);
}
if(i==3){
n=0,m,flag=1;
for(p=head;NULL!
=p;p=p->next)
n++;
for(m=1;flag&&m<=n;n++)
{
flag=0;
for(q=head->next,p=head,s=p;q;s=p,p=q,q=q->next){
if(p->gongzuo>q->gongzuo){
if(head==p){
head->next=q->next;
head=q;
q->next=p;
q=head->next;
p=head;
}
else{
p->next=q->next;
q->next=p;
s->next=q;
p=q;
q=p->next;
}
flag=1;
}
}
}
printf("排好序的信息如下:
\n");
print(head);
}
if(i!
=0&&i!
=1&&i!
=2&&i!
=3)
printf("输入出错!
请再次输入!
\n");
}
}
voidmain()
{
//main函数,程序执行的入口
DataTypex;//定义一个DataType结构体
SLNode*head;//定义一个链表的头节点
inti,n;
FILE*fp;//定义一个文件指针
ListInitiate(&head);//初始化链表
printf("请输入职工人数n:
");//提示用户输入员工的人数,来控制总的员工信息
scanf("%d",&n);//获得用户输入的员工的数目值
printf("请输入职工信息:
姓名、性别、出生年月、工作年月、学历、职务、住址、电话\n");
//提示,用户输入那些员工信息
for(i=0;i{
//不断获得n个员工的信息
scanf("%s%c%d%d%s%s%s%d",x.name,&x.sex,&x.chusheng,&x.gongzuo,x.xueli,x.zhiwu,x.zhuzhi,&x.dianhua);
//并将这些员工信息插入到所建的链表中
head=ListInsert(head,x);
}
//打开要存放数据的文件
if((fp=fopen("worker.txt","w"))==NULL){
printf("无法打开‘worker.txt’!
\n");
exit(0);
}
//把链表中用户输入的信息,放入worker.txt文件中
put(head,fp);
if(fclose(fp)){
printf("无法关闭‘worker.txt’!
\n");exit(0);
}
//打印出本系统的功能,即通过用户输入的不同的值来执行不同的操作
printf("0.结束系统\n1.新增一名职工\n2.删除一名职工\n3.查询职工信息\n4.修改职工信息\n5.对职工信息进行排序\n");
for(;;)
{
scanf("%d",&i);
if(i==0)
break;
if(i==1){
//增加员工信息
printf("请输入职工信息:
姓名