/*根据实验内容编程,上机调试、得出正确的运行程序。系统能够完成员工信息的查询、
更新、插入、删除、排序功能。写出实验报告(包括源程序和运行结果)。
[实现提示]
(1)建立一个带头结点的单向链表(无序)。
(2)对单链表进行插入,删除,更新操作。
(3)在主函数中设计一个简单的菜单,分别调试上述算法。
*/
#include
#include
#include
#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;
}
海译翻译