数据结构《职工管理系统》

主要功能:存储职工的职工号、姓名、部门号、工资,实现职工号、部门号、工资的排序,删除单个职工的记录、删除全部职工的记录。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h>
struct Worker 
//建立包含职工号、姓名、部门、工资的结构体 
{ 
	int no; /*职工号*/ 
	char name[10]; /*姓名*/ 
	int depno;    /*部门*/
	int salary; /*工资*/ 
	
}; 
//typedef struct Worker *pworker; 

struct LINK
///此为定义链表的结构体,结构名为LINK,结构成员为Worker和LINK 
{ 
	Worker w; 
	LINK *next; 
}; 
typedef struct LINK *PLINK; 

/*程序结束时释放内存*/ 
void release(PLINK p) 
{ 
	PLINK q; 
	while(NULL!=p->next) 
	{ 
		q=p; 
		p=p->next; 
		free(q); 
	} 
	free(p); 
} 

/*创建职工信息链表*/ 
PLINK create() 
{ 
	PLINK p=(PLINK)malloc(sizeof(struct LINK)); 
	if(NULL!=p) 
	{ 
		p->next=NULL; 
		return p; 
	} 
	printf("内存不足!\n"); 
	return NULL; 
}

 /*显示程序界面文字*/ 
void message() 
{ 
	system("cls");//清屏 
	system("color 00a");//字的颜色 
	
	 
	printf("                         --请输入:【1】  录入职工信息\n"); 
	printf("                         --请输入:【2】  浏览职工信息\n"); 
	printf("                         --请输入:【3】  按职工号排序\n"); 
	printf("                         --请输入:【4】  按部门号排序\n");
	printf("                         --请输入:【5】  按工资数排序\n"); 
	printf("                         --请输入:【6】  删除指定职工号信息\n"); 
	printf("                         --请输入:【7】  删除职工文件中的全部记录 \n"); 
	printf("		         --请输入:【8】  清屏\n"); 
	printf("                         --请输入:【-1】 退出\n"); 
} 

void SaveFile(PLINK p)	//将职工单链表数据存入数据文件
{
	PLINK q=p->next;
	int n=0;
	FILE *fp;
	if ((fp=fopen("work.txt","wb"))==NULL)   //以只写(‘wb’)的方式打开名为‘emp.dat’的文件
	{	
		printf("  提示:不能创建文件work.txt\n");
		return;
	}
	while (q!=NULL)
	{
		fwrite(&q->w,sizeof(Worker),1,fp);         //文件写接口
		q=q->next;
		n++;
	}
	fclose(fp);                               //关闭文件
	release(p);				//释放职工单链表L
	if (n>0)
		printf("  提示:%d个职工记录写入work.txt文件\n",n);
	else
		printf("  提示:没有任何职工记录写入work.txt文件\n");
}

/*录入职工信息*/ 
int add(PLINK p) 

//采用头插法 
{ 
	PLINK q=(PLINK)malloc(sizeof(struct LINK)); 
	if(NULL==q) 
	{ 
		printf("录入失败提示:内存不足!\n"); 
		return -1; 
	} 
	printf("请输入职工号(数字):"); 
	scanf("%d",&q->w.no); 
	PLINK h=p->next; 
	while(h) 
	{ 
		if(h->w.no==q->w.no) 
		{ 
			free(q); 
			printf("录入失败提示:此职工号已经存在!\n"); 
			return -1; 
		} 
		h=h->next; 
	} 

	printf("请输入职工姓名(文字):"); 
	scanf("%s",&q->w.name); 
	printf("请输入职工部门号(数字):"); 
	scanf("%d",&q->w.depno); 
	printf("请输入职工工资数(数字):"); 
	scanf("%d",&q->w.salary); 
 
	q->next=p->next;                        //头插法
	p->next=q; 
	printf("录入成功!\n"); 
	return -1; 
} 
void nopai(PLINK p){				//职工号排序
	PLINK o,pre,q;
	o=p->next->next;
	p->next->next=NULL;
	while(o!=NULL){
	q=o->next;
	pre=p;
	while(pre->next!=NULL&&pre->next->w.no<o->w.no)
		pre=pre->next;
	o->next=pre->next;
	pre->next=o;
	o=q;
	}
}

void depnopai(PLINK p){				//部门号排序
	PLINK o,pre,q;
	o=p->next->next;
	p->next->next=NULL;
	while(o!=NULL){
	q=o->next;
	pre=p;
	while(pre->next!=NULL&&pre->next->w.depno<o->w.depno)
		pre=pre->next;
	o->next=pre->next;
	pre->next=o;
	o=q;
	}
}

void salarypai(PLINK p)
//冒泡排序 
{				//工资排序
	PLINK o,pre,q;
	o=p->next->next;
	p->next->next=NULL;
	while(o!=NULL){
	q=o->next;
	pre=p;
	while(pre->next!=NULL&&pre->next->w.salary<o->w.salary)
		pre=pre->next;
	o->next=pre->next;
	pre->next=o;
	o=q;
	}
}
/*浏览职工信息*/
void show(PLINK p) 
{ 
	message(); 
	printf("浏览职工信息\n"); 
	printf("职工号\t姓名\t部门号\t工资\t\n"); 
	while(NULL!=p->next) 
	{ 
		printf("%d\t%s\t%d\t%d\t\n", 
		p->next->w.no,p->next->w.name,p->next->w.depno,p->next->w.salary);
	
		p=p->next; 
	} 
	printf("显示完毕!\n"); 
} 
/*按职工号删除职工信息*/ 
int del(PLINK p,int no) 
{ 
	message(); 
	printf("按职工号删除职工信息\n"); 
	while(NULL!=p->next) 
	{ 
		if(p->next->w.no==no) 
		{ 
			PLINK q=p->next; 
			p->next=p->next->next; 
			free(q);                    //释放结点
			printf("删除成功!\n"); 
			return 1; 
		} 
		p=p->next; 
	} 
	printf("没有你输入的职工号!\n"); 
	return -1; 
}
void dell(PLINK p){			//删除全部员工记录
	while(NULL!=p->next)   
	{ 
		
		
			PLINK q=p->next; 
			p->next=p->next->next; 
			free(q);                    //释放结点
			
		} 
		p=p->next; 
}


int main() 
{ 
	int cmd=0;/*命令号*/ 
	int no; 
	char name[4]; 
	PLINK pworker; 
	if(!(pworker=create())) 
	{ 
		exit(0);/*如果创建职工信息链表表头失败则结束程序*/ 
	} 
	while(cmd!=-1) 
	{ 
		switch(cmd) 
		{ 
			case 0: 
				message(); 
			break; 
			case 1: 
				add(pworker); 
			break; 
			case 2: 
				show(pworker); 
			break; 
			case 3: 
				nopai(pworker);
				show(pworker);
				printf("按职工号排列成功!\n");
			break; 
			case 4: 
				depnopai(pworker);
				show(pworker);
				printf("按部门号排列成功!\n"); 
			break;
			case 5: 
				salarypai(pworker);
				show(pworker);
				printf("按工资排列成功!\n"); 
				break; 
			case 6: 
				printf("请输入要删除的职工号:"); 
				scanf("%d",&no); 
				del(pworker,no); 
				show(pworker);
				printf("删除成功!\n"); 
			break; 
			case 7: 
			
				dell(pworker);
				show(pworker);
				printf("已经删除全部记录!"); 
				break; 

			case 8: 
				default: 
				message(); 
			} 
		printf("请输入操作命令数字:\n"); 
		scanf("%d",&cmd);/*接收命令*/ 
		} 
 
    release(pworker);
	return 0; 
} 

猜你喜欢

转载自blog.csdn.net/qq_40605167/article/details/86425390