/*根据实验内容编程,上机调试、得出正确的运行程序。系统能够完成员工信息的查询、 更新、插入、删除、排序功能。写出实验报告(包括源程序和运行结果)。 [实现提示] (1)建立一个带头结点的单向链表(无序)。 (2)对单链表进行插入,删除,更新操作。 (3)在主函数中设计一个简单的菜单,分别调试上述算法。 */ #include<stdio.h> #include<stdlib.h> #include<conio.h> #define SEEK_SET 0 int num=0; FILE *fp; char filename[30]; typedef struct NodeType{ int Wno; char Wname[20]; char Wsex[2]; char Wbirth[10]; char Wduty[24]; int Wphone; char Waddress[20]; struct NodeType *next; }Node; Node * create_list() { Node * head; head = (Node *)malloc(sizeof(Node)); head->next=NULL; return head; } Node *InsertList(Node *head) { char ch; Node *p=head->next,*q; ch = 'y'; while(ch!='N' && ch!='n') { q=(Node *)malloc(sizeof(Node)); printf("请输入第%d员工信息:\n",num+1); printf("员工号码:"); scanf("%d",&q->Wno); printf("员工姓名:"); scanf("%s%*c",q->Wname); //fflush(stdin); printf("员工性别(男or女):"); scanf("%s%*c",q->Wsex); /// fflush(stdin); printf("员工生日:(1999-09-09)"); scanf("%s%*c",q->Wbirth); /// fflush(stdin); printf("员工职责:"); scanf("%s%*c",q->Wduty); printf("员工电话:"); scanf("%d",&q->Wphone); printf("员工住址:"); scanf("%s%*c",q->Waddress); /// fflush(stdin); q->next = p; head->next = q; p=head->next; num++; printf("成功输入数据,现在已有%d位员工的信息保存!",num); printf("是否继续输入(YorN)?"); scanf("%c",&ch); } return head; } Node *Select(Node *head,int Wno,int flag) //flag=1 获取当前位置,其他则返回前一位置 { Node *p,*q; int mark=0; putchar(10); if(head->next == NULL) { printf("无任何信息!\n"); return NULL; } q=head; p=q->next; while(p) { if(Wno == p->Wno) { printf("已找到,信息如下:\n"); printf("%d,%s,%s,%s,%s,%d,%s\n",p->Wno,p->Wname,p->Wsex,p->Wbirth,p->Wduty,p->Wphone,p->Waddress); mark=1; break; } else { q=q->next; //q前一位置 p=p->next; // if(p->next == NULL) break; } } if(mark==0) { printf("查无此信息!\n"); return NULL; } else if(flag == 1 )return p; //当前位置 else return q; //上一位 } void *Delete(Node *head,int Wno) { Node *p,*q; p=Select(head,Wno,0); q=p->next; putchar(10); printf("此人的工号为%d \n",q->Wno); p->next=q->next; free(q); p = Select(head,Wno,1); } void update(Node *head,int Wno) { Node *p; int i=0; p=Select(head,Wno,1); if(p) { do{ printf("\n\n\t 更 新\n"); printf("\t更新姓名--------1\n"); printf("\t更新性别--------2\n"); printf("\t更新生日--------3\n"); printf("\t更新职责--------4\n"); printf("\t更新电话--------5\n"); printf("\t更新地址--------6\n"); printf("\t结束更新--------7\n"); printf("\t\t请输入您的选择:"); scanf("%d",&i); switch(i) { case 1: printf("请输入姓名:"); scanf("%s%*c",p->Wname); break; case 2: printf("请输入性别:"); scanf("%s%*c",p->Wsex); break; case 3: printf("请输入生日:"); scanf("%s%*c",p->Wbirth); break; case 4: printf("请输入职责:"); scanf("%s%*c",p->Wduty); break; case 5: printf("请输入电话:"); scanf("%d",p->Wphone); break; case 6: printf("请输入地址:"); scanf("%s%*c",p->Waddress); break; default: break; } }while(i<7); printf("工号\t 姓名\t 性别\t 出生日期\t 职责\t 手机号\t 联系地址\t\n"); printf("%10d,%10s,%2s,%10s,%10s,%15d,%20s\n",p->Wno,p->Wname,p->Wsex,p->Wbirth,p->Wduty,p->Wphone,p->Waddress); putchar(10); } } void Destory(Node *head) { Node *p,*q; p=head; q=head->next; while(p) { free(p); p=q; if(q) q=q->next; } } void traserval(Node *head) //遍历 { Node *p; p=head; printf("\n\n\t全部信息:\n"); while(1) { if(p->next == NULL) break; p = p->next; printf("工号\t 姓名\t 性别\t 出生日期\t 职责\t 手机号\t 联系地址\t\n"); printf("%10d,%10s,%2s,%10s,%10s,%15d,%20s\n",p->Wno,p->Wname,p->Wsex,p->Wbirth,p->Wduty,p->Wphone,p->Waddress); } } void QListSort(Node **head,Node *end)// 快速排序 { Node *right; Node **left_walk, **right_walk; Node *pivot, *old; int count, left_count, right_count; if (*head == end) return; do { pivot = *head; left_walk = head; right_walk = &right; left_count = right_count = 0; //取第一个节点作为比较的基准,小于基准的在左面的子链表中, //大于基准的在右边的子链表中 for (old = (*head)->next; old != end; old = old->next) { if (old->Wno < pivot->Wno) { //小于基准,加入到左面的子链表,继续比较 ++left_count; *left_walk = old; //把该节点加入到左边的链表中, left_walk = &(old->next); } else { //大于基准,加入到右边的子链表,继续比较 ++right_count; *right_walk = old; right_walk = &(old->next); } } //合并链表 *right_walk = end; //结束右链表 *left_walk = pivot; //把基准置于正确的位置上 pivot->next = right; //把链表合并 //对较小的子链表进行快排序,较大的子链表进行迭代排序。 if(left_walk > right_walk) { QListSort(&(pivot->next), end); end = pivot; count = left_count; } else { QListSort(head, pivot); head = &(pivot->next); count = right_count; } } while (count > 1); } void creatfile() { printf("\n请输入文件名:"); scanf("%s",filename); /*创建一个文件的名字*/ if((fp=fopen(filename,"w"))==NULL) /*打开文件,实现向文件输入数据*/ { printf("\n不能建立!"); exit(0); } else printf("已成功建立%s",filename); fclose(fp); } void output(Node *head) { int i; Node *p; p=head->next; creatfile(); if((fp=fopen(filename,"wb"))==NULL) /*打开文件*/ { printf("\n不能打开该文件!"); exit(0); } fputs("员工信息",fp); fputc(10,fp); while(p) { if(fwrite(&p->Wno,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n"); if(fwrite(&p->Wname,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n"); if(fwrite(&p->Wsex,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n"); if(fwrite(&p->Wbirth,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n"); if(fwrite(&p->Wduty,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n"); if(fwrite(&p->Wphone,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n"); if(fwrite(&p->Waddress,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n"); fputc(10,fp); i++; p=p->next; } fscanf(fp,"共计%d人",num); fputc(10,fp); fclose(fp); printf("\t已经成功内容写入到%s了!\n",filename); } int menu(int i) { putchar(10); putchar(10); putchar(10); printf("\t┏━━━━━━━━━━人事管理系统━━━━━━━━━━━━┓\n"); printf("\t┃ ┃\n"); printf("\t┃ ┃\n"); printf("\t┃ 1、添加员工信息 ……………………………… 1 ┃\n"); printf("\t┃ 2、更新员工信息 ……………………………… 2 ┃\n"); printf("\t┃ 3、删除员工信息 ……………………………… 3 ┃\n"); printf("\t┃ 4、员工信息排序 ……………………………… 4 ┃\n"); printf("\t┃ 5、查找相关员工 ……………………………… 5 ┃\n"); printf("\t┃ 6、输出文件 ……………………………… 6 ┃\n"); printf("\t┃ 7、全部信息输出 ……………………………… 7 ┃\n"); printf("\t┃ 8、退出系统 ……………………………… 8 ┃\n"); printf("\t┃ ┃\n"); printf("\t┃ ┃\n"); printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf("\t\t\t请选择: "); scanf("%d",&i); putchar(10); return i; } int main() { int i=0,Wno; Node *p; p=create_list(); system("mode con: cols=120 lines=40"); while(i<8) { i=menu(i); if(i==8) { system("cls"); printf("\n\n\n\t\t\t\谢谢使用\n\n\n\n\n\t"); break; } switch(i) { case 1: p=InsertList(p); //traserval(p); break; case 2: printf("请输入更新员工的工号: "); scanf("%d",&Wno); update(p,Wno); break; case 3: printf("请输入删除的工号:"); scanf("%d",&Wno); Delete(p,Wno); traserval(p); break; case 4: QListSort(&(p->next),NULL); traserval(p); break; case 5: printf("请输入查找的工号: "); scanf("%d",&Wno); Select(p,Wno,1); break; case 6: output(p); break; case 7: traserval(p); break; default: break; } } Destory(p); return 0; }
海译翻译