题目要求:

设计思路:

主要代码:

#include<iostream>
#include<windows.h>
#include<cstdio>
#include<cstring>
#include<fstream>
#define MAX 100
#define len 10
using namespace std;
typedef struct staff
{
	char name[MAX];
	int id;
	char sex[MAX];
	char birth[MAX];
	char work[MAX];
	char edu[MAX];
	char job[MAX];
	char add[MAX];
	char tel[MAX];
	struct staff* next;
}stnode,*Tst;
typedef struct
{
	Tst elem[MAX];
	int count;
}HashTable;
Tst head=new stnode;
HashTable H;
char password[MAX]="1234abcd";
void add()
{
	Tst p=new stnode;
	Tst q=new stnode;
	printf("请输入职工姓名: ");
	scanf("%s",p->name);
	printf("请输入职工工号: ");
	scanf("%d",&p->id);
	printf("请输入职工性别: ");
	scanf("%s",p->sex);
	printf("请输入职工出生年月: ");
	scanf("%s",p->birth);
	printf("请输入职工入职年月: ");
	scanf("%s",p->work);
	printf("请输入职工学历: ");
	scanf("%s",p->edu);
	printf("请输入职工职位: ");
	scanf("%s",p->job);
	printf("请输入职工地址: ");
	scanf("%s",p->add);	
	printf("请输入职工电话: ");
	scanf("%s",p->tel);
	if(head->next==NULL)
	   head->next=p;
	 else
	{
	 q=head->next;
	 while(q->next!=NULL)
	 q=q->next;
	 q->next=p;	
	}
}
void seek()
{
	Tst p=new stnode;
	if(head->next==NULL)
	{
		printf("此时无职员信息,可以选择添加职员信息\n");
		return;
	}
	else
	{
		p=p->next;
		printf("请输入职工的姓名进行职工信息查找\n");
		char x[20];
		scanf("%s",x);
		while(p)
		{
			if(strcmp(p->name,x)==0)
			{
				printf("职工的姓名:%s\n",p->name);
				printf("职工的工号:%d\n",p->id);
				printf("职工的性别:%s\n",p->sex);
				printf("职工的出生年月:%s\n",p->birth);
				printf("职工的入职年月:%s\n",p->work);
				printf("职工的学历:%s\n",p->edu);
				printf("职工的职位:%s\n",p->job);
				printf("职工的地址:%s\n",p->add);
				printf("职工的电话号码:%s\n",p->tel);
				return;
			}
			else  p=p->next;
		}
		printf("未找到职工信息\n");
	}
}
void del()
{
	int a;
	Tst p=new stnode;
	Tst q=new stnode;
    p=head->next;
    q=head;
	if(head->next==NULL)
	{
	  printf("没有可以删除的职员信息\n");
	  return ;	
	}
	printf("想要删除的职员工号:");
	scanf("%d",&a);
	if(p->next==NULL&&p->id==a)
	{
		q->next=NULL;
		delete p;
		printf("删除成功!\n");
		return;
	}
	else if(p->next==NULL&&p->id!=a)
	{
		printf("该职员不存在\n");
		return;
	}
	else
	{
		while(p)
		{
			if(p->id==a)
			{
				q->next=p->next;
				delete p;
				printf("删除成功!\n");
				return;
			}
			else
			{
				p=p->next;
				q=q->next;
			}
		}
	}
	if(p==NULL)
	{
		printf("该职员信息不存在\n");
		return;
	}
}
void modify()
{
	Tst p=new stnode;
	p=head->next;
	if(p==NULL)
	{
		printf("没有可以修改的信息!\n");
		return;
	}
	else
	{
		printf("输入想要修改的职员工号\n");
		int x;
		int t;
		scanf("%d",&x);
		while(p)
		{
			
		 if(p->id==x)
		 {
			printf("输入想要修改的信息\n");
			printf("0.退出      1.姓名      2.工号\n");
			printf("3.性别      4.出生年月  5.入职年月\n");
			printf("6.学历  7.职位  8.地址  9.电话\n");
			while(1)
			{
				scanf("%d",&t);
				if(t==0)  return;
				else if(t==1)
				{
					printf("请输入修改后的姓名:\n");
					scanf("%s",p->name);
					printf("修改成功\n");
				}
				else if(t==2)
				{
					printf("请输入修改后的工号:\n");
					scanf("%d",&p->id);
					printf("修改成功\n");
				}
				else if(t==3)
				{
					printf("请输入修改后的性别:\n");
					scanf("%s",p->sex);
					printf("修改成功\n");
				}
				else if(t==4)
				{
					printf("请输入修改后的出生年月:\n");
					scanf("%s",p->birth);
					printf("修改成功\n");
				}
				else if(t==5)
				{
					printf("请输入修改后的入职年月:\n");
					scanf("%s",p->work);
					printf("修改成功\n");
				}
				else if(t==6)
				{
					printf("请输入修改后的学历:\n");
					scanf("%s",p->edu);
					printf("修改成功\n");
				}
				else if(t==7)
				{
					printf("请输入修改后的职位:\n");
					scanf("%s",p->job);
					printf("修改成功\n");
				}
				else if(t==8)
				{
					printf("请输入修改后的地址:\n");
					scanf("%s",p->add);
					printf("修改成功\n");
				}
				else if(t==9)
				{
					printf("请输入修改后的电话:\n");
					scanf("%s",p->tel);
					printf("修改成功\n");
				}
				else return;
			}
		}
		else
			p=p->next;
	  }
	  if(p==NULL)
	  	printf("未找到该职员信息!\n");
	}
}
void sort()
{
	Tst p=new stnode;
	Tst q=new stnode;
	p=head->next;
	q=p->next;
	if(p==NULL)
	{
		printf("无职工信息\n");
		return;
	}
	else
	{
		while(p!=NULL)
		{
			while(q!=NULL)
			{
				if(strcmp(p->name,q->name)>0)
				{
					int id1;
					char name1[MAX],sex1[MAX],birth1[MAX],work1[MAX];
					char edu1[MAX],job1[MAX],add1[MAX],tel1[MAX];
					strcpy(name1,p->name);
					strcpy(p->name,q->name);
					strcpy(q->name,name1);//name
					id1=p->id;
					p->id=q->id;
					q->id=id1;
					strcpy(sex1,p->sex);
					strcpy(p->sex,q->sex);
					strcpy(q->sex,sex1);//sex
					strcpy(birth1,p->birth);
					strcpy(p->birth,q->birth);
					strcpy(q->birth,birth1);//birth
				    strcpy(work1,p->work);
					strcpy(p->work,q->work);
					strcpy(q->work,work1);//work
					strcpy(edu1,p->edu);
					strcpy(p->edu,q->edu);
					strcpy(q->edu,edu1);//edu
					strcpy(job1,p->job);
					strcpy(p->job,q->job);
					strcpy(q->job,job1);//job
					strcpy(add1,p->add);
					strcpy(p->add,q->add);
					strcpy(q->add,add1);//add
					strcpy(tel1,p->tel);
					strcpy(p->tel,q->tel);
					strcpy(q->tel,tel1);//tel
				}
				q=q->next;
			}
			p=p->next;
			if(p!=NULL)
			{
				q=p->next;
			}
			else
			{
				return;
			}
			printf("排序成功\n");
			return;
		}
	}
}
void power()
{
	int count=0;
	char x[MAX];
	printf("欢迎访问职工管理系统\n");
	while(count!=5)
	{
		printf("请输入密码继续!\n");
		scanf("%s",x);
		if(strcmp(password,x)==0)
		{
			printf("密码正确!\n");
			Sleep(1500);
			system("cls");
			return;
		}
		else
		{
			printf("密码错误!请重新输入!\n");
			count++;
		}
	}
	printf("输入错误超过五次!正在退出...\n");
	exit(0);
}
void print()
{
	if(head->next==NULL)
	{
		printf("表格为空,不可打印!\n");
		return ;
	}
	else
	{
		printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","姓名","工号","性别","出生年月","入职年月","学历","职位","地址","电话");
	    Tst p=new stnode;
		p=head->next;
		while(p)
		{
			printf("%-10s%-10d%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",p->name,p->id,p->sex,p->birth,p->work,p->edu,p->job,p->add,p->tel);
			p=p->next;
		}
	}
}
void to_file()
{
	ofstream ofs;
	ofs.open("file.txt",ios::out);
	Tst p=new stnode;
	p=head->next;
	while(p!=NULL)
	{
		ofs<<p->name<<" "<<p->id<<" "<<p->sex<<" "<<p->birth<<" "<<p->work<<" "<<p->edu<<" "<<p->job<<" "<<p->add<<" "<<p->tel<<endl;
		p=p->next;
	}
	printf("成功写入file.txt文件!\n");
	ofs.close();
}
void from_file()
{
	int i=1;
	ifstream ifs;
	ifs.open("file.txt",ios::in);
	if(!ifs.is_open())
	{
		printf("文件打开失败!\n");
		return;
	}
	char temp[MAX];
	while(ifs>>temp)
	{
		Tst p=new stnode;
		printf("正在导入第%d个数据\n",i);
		strcpy(p->name,temp);
		ifs>>p->id>>p->sex>>p->birth>>p->work>>p->edu>>p->job>>p->add>>p->tel;
		if(head->next==NULL)
		    head->next=p;
		else
		{
			Tst q=new stnode;
			q=head->next;
			while(q->next!=NULL)
			    q=q->next;
			q->next=p;
		}
	i++;
	}
	printf("导入成功!\n");
}
void sort1()
{
	Tst p=new stnode;
	Tst q=new stnode;
	p=head->next;
    if(p==NULL)
	{
		printf("此时无职员信息\n");
		return;
	}	
	int l=0;
	q=head->next;
	while(q)
	{
		l++;
		q=q->next;
	} 
	Tst pt=new stnode;
	Tst u=new stnode;
	pt=head->next;
	u=pt->next;
	for (int i=0;i<l-1;i++)//排序采用冒泡排序,为保证指针部位空多次进行判断
    {
        for (int j=i;j<l;j++)
        {
            if((strcmp(pt->name,u->name)>0)&&(u->next))
            {
                char name1[MAX];
                int id1;
				char sex1[MAX];
				char birth1[MAX];
				char work1[MAX];
				char edu1[MAX];
				char job1[MAX];
				char add1[MAX];
				char tel1[MAX];
				strcpy(name1,u->name);
				strcpy(u->name,pt->name);
				strcpy(pt->name,name1);//交换名字 
				id1=u->id;
				u->id=pt->id;
				pt->id=id1;
				strcpy(u->sex,pt->sex);
				strcpy(sex1,u->sex);
				strcpy(pt->sex,sex1);//交换性别 
				strcpy(birth1,u->birth);
				strcpy(u->birth,pt->birth);
				strcpy(pt->birth,birth1);//交换出生日期 
				strcpy(work1,u->work);
				strcpy(u->work,pt->work);
				strcpy(pt->work,work1);//交换入职日期 
				strcpy(edu1,u->edu);
				strcpy(u->edu,pt->edu);
				strcpy(pt->edu,edu1);//交换学历 
				strcpy(job1,u->job);
				strcpy(u->job,pt->job);
				strcpy(pt->job,job1);//交换职位 */
				strcpy(add1,u->add);
				strcpy(u->add,pt->add);
				strcpy(pt->add,add1);//交换地址 */
				strcpy(tel1,u->tel);
				strcpy(u->tel,pt->tel);
				strcpy(pt->tel,tel1);//交换电话号码*/
				//cout<<"1";
				u=u->next;
            }
            else if((strcmp(pt->name,u->name)>0)&&(j==l-1))
            {
            	int id1;
                char name1[MAX];
				char sex1[MAX];
				char birth1[MAX];
				char work1[MAX];
				char edu1[MAX];
				char job1[MAX];
				char add1[MAX];
				char tel1[MAX];
			    strcpy(name1,u->name);
				strcpy(u->name,pt->name);
				strcpy(pt->name,name1);//交换名字 
				id1=u->id;
				u->id=pt->id;
				pt->id=id1;
				strcpy(sex1,u->sex);
				strcpy(u->sex,pt->sex);
				strcpy(pt->sex,sex1);//交换性别 
				strcpy(birth1,u->birth);
				strcpy(u->birth,pt->birth);
				strcpy(pt->birth,birth1);//交换出生日期 
				strcpy(work1,u->work);
				strcpy(u->work,pt->work);
				strcpy(pt->work,work1);//交换入职日期 
				strcpy(edu1,u->edu);
				strcpy(u->edu,pt->edu);
				strcpy(pt->edu,edu1);//交换学历 */
				strcpy(job1,u->job);
				strcpy(u->job,pt->job);
				strcpy(pt->job,job1);//交换职位 */
				strcpy(add1,u->add);
				strcpy(u->add,pt->add);
				strcpy(pt->add,add1);//交换地址 */
				strcpy(tel1,u->tel);
				strcpy(u->tel,pt->tel);
				strcpy(pt->tel,tel1);//交换电话号码
                }
            else if(u->next) 
				u=u->next;
        }
        if(pt->next&&pt->next->next)
        {
            pt=pt->next;//继续遍历
            u=pt->next;
        }    
	}
    printf("排序成功\n");
}
void Init()
{
    for(int i=0;i<MAX;i++)
    	H.elem[i]=NULL;
    H.count=0;
}
int Hash(int x)
{
	return x%len;
}
void Insert()
{
	Tst p=new stnode;
	p=head->next;
	while(p)
	{
		int addr=Hash(p->id);
		while(H.elem[addr]!=NULL)
			addr=(addr+1)%len;
		H.elem[addr]=p;
		H.count++;
		p=p->next;
	}
}
Tst Search(int k)
{
	int addr=Hash(k);
	while(H.elem[addr]->id!=k)
	{
		if(H.elem[addr]==NULL)
		    return NULL;
		addr=(addr+1)%len;
	}
	return H.elem[addr];
}
void HashSearch()
{
	Tst p=new stnode;
	int temp;
	Init();
	Insert();
	printf("请输入职工工号\n");
	scanf("%d",&temp);
	p=Search(temp);
	if(p==NULL)
	{
		printf("查找的职工不存在!\n");
		return ;
	}
	printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","姓名","工号","性别","出生年月","入职年月","学历","职位","地址","电话");
	printf("%-10s%-10d%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",p->name,p->id,p->sex,p->birth,p->work,p->edu,p->job,p->add,p->tel);
}
void menu()
{
        int x;
		printf("**********职工管理系统***********\n");
		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("***********9.导出文件************\n");
		printf("****10.按工号查找(哈希查找)****\n");
		printf("*************0.退出**************\n");
        while(1)
	   {
	     printf("请输入选项:\n");
		 scanf("%d",&x);
		 if(x==0)  exit(0);
		 else if(x==1)  print();
		 else if(x==2)  add();
		 else if(x==3)  del();
		 else if(x==4)  seek();
		 else if(x==5)  modify();
		 else if(x==6)  sort();
		 else if(x==7)  sort1();
		 else if(x==8) to_file();
		 else if(x==9) from_file();
		 else if(x==10) HashSearch();
		 else exit(0);
	}
}
int main()
{
	power();
	printf("正在导入职工信息……\n");
	from_file();
	Sleep(1500);
	system("cls");
	menu();
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐