鲤鱼乡哥儿种田汉子:链表综合算法设计

来源:百度文库 编辑:高考问答 时间:2024/05/01 13:21:46
、链表综合算法设计:
数据结构是:职工号(no)、姓名(name)、部门号(depno)、工资数(salary)、职工号指针(pno)、部门号指针(pdepno)和工资数指针(psalary)。设计一个程序,(用单链表实现),完成如下功能:
1) 输入:添加一个职工记录;
2) 输出:按部门号指针输出全部职工记录;
3) 按no将职工记录从小到大排序;
4) 按no链将职工记录全部输出;
5) 删除全部职工的记录;

//文件名:excise1.cpp
# include<stdio.h>
# include<malloc.h>
typedef struct
{ int no; //职工编号
char name[10]; //姓名
int depno; //部门号
float salary; //工资
}EmpType; //职工类型

typedef struct node
{ EmpType data; //存放职工信息
struct node *next; //指向下一个节点的指针
}EmpList; //职工单链表节点类型
void DelAll(EmpList * &L) //清除职工文件中的全部记录
{ FILE *fp;
EmpList *p,*q;
if ((fp=fopen("emp.dat","wb"))==NULL) //重写清空emp.dat文件
{ printf(" 提示:不能打开职工文件\n");
return;
}
fclose(fp);
p=L->next;
if (p!=NULL)
{ q=p->next;
while(q!=NULL)
{ free(p);
p=q;
q=q->next;
}
free(p);
L->next=NULL;

}
else
printf("提示:不存在任何职工记录\n");
printf("提示:职工数据清除完毕\n");
}
void ReadFile(EmpList * &L)//读emp.dat文件建立职工单链表L
{ FILE *fp;
EmpType emp;
EmpList *p,*r;
int n=0; //累加从emp.dat文件中读出的职工记录个数
L=(EmpList *)malloc(sizeof(EmpList)); //建立头节点

r=L;
if((fp=fopen("emp.dat","rb"))==NULL)
{if((fp=fopen("emp.dat","wb"))==NULL)
printf("提示:不能创建emp.dat文件\n");

}
else//存在emp.da文件
{while(fread(&emp,sizeof(EmpType),1,fp)==1)

{//采用尾插法建立单链表L
p=(EmpList *)malloc(sizeof(EmpList));
p->data=emp;
r->next=p;
r=p;
n++;
}
}
r->next=NULL;
printf("提示:职工单链表L建立完毕,有%d个记录\n",n);
fclose(fp);
}
void SaveFile(EmpList *L)//将职工单链表数据存入数据文件
{EmpList *p=L->next,*q;
FILE *fp;
if((fp=fopen("emp.dat","wb"))==NULL)
{printf("提示:不能创建文件emp.dat\n");
return;
}
while(p!=NULL)
{fwrite(&p->data,sizeof(EmpType),1,fp);
p=p->next;
}
fclose(fp);
p=L;
q=p->next;//释放职工单链表
while(q!=NULL)
{free(p);
p=q;
q=q->next;
}
free(p);
printf("提示:所有职工记录成功写入到emp.dat文件中\n");
}
void InputEmp(EmpList *&L)//添加一个职工记录
{if(L!=NULL){
EmpList *p;
printf(">>输入职工号,姓名,部门号,工资:");
p=(EmpList *)malloc(sizeof(EmpList));
scanf("%d%s%d%f",&p->data.no,p->data.name,&p->data.depno,&p->data.salary);
p->next=L->next;
L->next = p;
}else{

printf("error ! cause by NULL ponter of L");
}
}
void Sortno(EmpList *&L){
EmpList *p,*pre,*q;
p = L->next->next;
if(NULL!=p){
L->next->next = NULL;
while(p!=NULL){
q=p->next;
pre = L;
while(pre->next!=NULL && pre ->next->data.no < p->data.no){
pre = pre->next;
}
p->next = pre ->next;
pre->next = p;
p = q;
}
}
}

void Sortdepno(EmpList * &L)//采用直接插入法对单链表L按depno递增有序排序
{EmpList *p,*pre,*q;
p=L->next->next;
if(p!=NULL)
{L->next->next=NULL;
while(p!=NULL)
{q=p->next;
pre=L;
while(pre->next!=NULL&&pre->next->data.depno<p->data.depno)
pre=pre->next;
p->next=pre->next;
pre->next=pre->next;
pre->next=p;
p=q;

}
}
printf("提示:按depno递增排序完毕\n");
}
void Sortsalary(EmpList * &L)//采用直接插入法对单链表L按salary递增有序排序
{EmpList *p,*pre,*q;
p=L->next->next;
if(p!=NULL)
{L->next->next=NULL;
while(p!=NULL)
{q=p->next;
pre=L;
while(pre->next!=NULL &&
pre->next->data.salary<p->data.salary)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}

}
printf("提示:按salary递增排序完毕\n");
}
void Display(EmpList * L)//输出所以职工记录
{EmpList * p=L->next;
if(p==NULL)
printf("提示:没有任何职工记录\n");
else
{printf("编号 姓名 部门号 工资\n");
printf(" -----------------------------------------------------\n");
while(p!=NULL)
{printf(" >> % 3d % 10s % -8d % 7.2f\n ",p->data.no,
p->data.name,p->data.depno,p->data.salary);
p=p->next;
}
printf(" ------------------------------------------------------\n");
}
}
void main()
{EmpList * L;
int sel;
printf("由emp.dat文件建立职工单链表L\n");
ReadFile(L);
do
{printf("1:输入 2:显示 3:按no排序 4:按depno排序5:按salary排序 9:全清 0:退出 请选择:");
scanf("%d",&sel);
switch(sel)
{
case 9:
DelAll(L);
break;
case 1:
InputEmp(L);
break;
case 2:
Display(L);
break;
case 3:
Sortno(L);
break;
case 4:
Sortdepno(L);
break;
case 5:
Sortsalary(L);
break;
}
}while (sel!=0);
SaveFile(L);
}