else
Nofind(); //if(p)结束
} //void Modify(Link l) //修改功能结束
//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。 void Insert(Link l) {
Node *s,*r,*p; /*p指向插入位置,p指新插入记录节点*/ char ch,new_num[10],old_num[10];
//old_num[]保存插入点位置之前的工号,new_num[]保存输入的新记录的工号 int flag=0; s=l->next; system(\Disp(l);
while(1) {
//stringinput(s,10,\ after the Number:\
printf(\请你输入已存在的工号(以'0'返回上一级菜单:)\scanf(\
if(strcmp(old_num,\ //输入'0',跳出while(1),即跳出Insert()函数 return;
s=l->next; //作用? 每次从第一个节点开始找 flag=0;
while(s) /*查询该工号是否存在,flag=1表示该工号存在*/ {
if(strcmp(s->data.num,old_num)==0) {
flag=1; break; }
s=s->next; }
if(flag==1)
break; /*若工号存在,则进行插入之前的新记录的输入操作*/ else {
getchar();
printf(\scanf(\if(ch=='y'||ch=='Y') {continue;} else
{return;} //回主菜单 }
}//while(1)
/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add()相同*/
printf(\请你输入待插入的工号(以'0'返回上一级菜单:)\scanf(\
if(strcmp(new_num,\ //输入'0',跳出while(1),即跳出add()函数 return;
s=l->next; //作用? 每次从第一个节点开始找,看num是否重复。
while(s) //工号重复时,返回主菜单 {
if(strcmp(s->data.num,new_num)==0) {
printf(\提示:工号为'%s'的已经职工存在'!\\n\flag=1; return ; }
s=s->next; } //while(s)
p=(Node *)malloc(sizeof(Node)); if(!p) {
printf(\如没有申请到,打印提示信息*/ return ; /*返回主界面*/ }
strcpy(p->data.num,new_num); printf(\请你输入姓名:\scanf(\getchar();
printf(\请你输入性别:\scanf(\getchar();
printf(\请你输入部门:\scanf(\getchar();
printf(\请你输入职称:\scanf(\getchar();
printf(\请你输入工资:\scanf(\getchar();
// 信息输入已经完成
p->next=NULL; /*表明这是链表的尾部结点*/
saveflag=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/ /*将指针赋值给r,因为l中的头节点的下一个节点才实际保存着学生的记录*/
r=l->next; while(1) {
if(strcmp(r->data.num,old_num)==0) /*在链表中插入一个节点*/ {
p->next=r->next; r->next=p; break; }
r=r->next; }// while(1) , r作为查询指针,依次从第一个节点找起,找到后 跳出 while(1)循环
Disp(l);
printf(\// getchar(); }
/*统计该公司工资最高和最低的人数及平均工资*/ void Tongji(Link l) {
Node *pm,*pn; /*用于指向工资最高和最低节点*/ Node *r=l->next;
int countm=0,countn=0; /*保存工资最高,最低*/ if(!r)
{ system(\
printf(\getchar(); return ; }
system(\Disp(l); pm=pn=r; while(r) {
if(r->data.gz<1900) countm++; if(r->data.gz<4000) countn++;
if(r->data.gz>=pm->data.gz) pm=r; if(r->data.gz>=pn->data.gz) pn=r; r=r->next; }
printf(\printf(\printf(\
printf(\
printf(\printf(\ gz:%d\\n\printf(\getchar(); }
/*利用插入排序法实现单链表的按总分字段的降序排序,从高到低*/ void Sort(Link l) {
Link ll;
Node *p,*rr,*s; int i=0;
if(l->next==NULL) { system(\
printf(\getchar(); return ; }
ll=(Node*)malloc(sizeof(Node)); /*用于创建新的节点*/ if(!ll) {
printf(\如没有申请到,打印提示信息*/ return ; /*返回主界面*/ }
ll->next=NULL;
system(\
Disp(l); /*显示排序前的所有职工记录*/ p=l->next;
while(p) /*p!=NULL*/ {
s=(Node*)malloc(sizeof(Node)); /*新建节点用于保存从原链表中取出的节点信息*/ if(!s) /*s==NULL*/ {
printf(\如没有申请到,打印提示信息*/ return ; /*返回主界面*/ }
s->data=p->data; /*填数据域*/
s->next=NULL; /*指针域为空*/ rr=ll;
/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/
while(rr->next!=NULL && rr->next->data.gz>=p->data.gz)
{rr=rr->next;} /*指针移至工资比p所指的节点的工资低的节点位置*/
if(rr->next==NULL)/*若新链表ll中的所有节点的工资值都比p->data.gz大时,就将p所指节点加入链表尾部*/ rr->next=s;
else /*否则将该节点插入至第一个工资字段比它低的节点的前面*/ {
s->next=rr->next; rr->next=s; }
p=p->next; /*原链表中的指针下移一个节点*/ }
l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/
p=l->next; /*已排好序的头指针赋给p,准备填写名次*/ while(p!=NULL) /*当p不为空时,进行下列操作*/ {
i++; /*结点序号*/
p->data.mingci=i; /*将名次赋值*/ p=p->next; /*指针后移*/ }
Disp(l); saveflag=1;
printf(\ =====>sort complete!\\n\ }