C语言实现的人员管理系统(顺序表版)

该系统具有以下主要功能:

  1. 添加人员信息:在有空间的前提下,用户输入人员的工号、姓名、性别、联系电话和 QQ 号等信息,系统会自动检查编号的唯一性,确保不重复。
  2. 查找人员信息:提供按工号和姓名两种查找方式,找到后会显示相应人员的详细信息。
  3. 修改人员信息:可以按工号或姓名进行修改,修改时编号不能更改。
  4. 删除人员信息:同样支持按工号和姓名删除,删除前会进行确认。
  5. 统计人员数量:能给出当前公司人员的总数。
  6. 显示人员信息:可以展示全体人员的信息或指定单个人员的信息。
  7. 保存和读取文件:能将人员信息保存到指定文件,也能从文件中读取人员信息。
  8. 排序人员信息:提供插入排序和冒泡排序两种方式,可对人员按工号进行排序。
    #include<stdio.h>
    #include<stdlib.h>   //内存管理
    #include<string.h>   //字符串操作
    
    #define MaxSize 20
    //数据元素结构
    typedef struct
    {	int  no;        //工号
    	char name[20];  //姓名
    	int sex;        //性别
    	char tel[14];  //联系电话
    	char qq[12];   //QQ号
    }ElemType;  
    
     //顺序表结构
    typedef struct
    {
    	ElemType list[MaxSize];
    	int length;
    }SeqList;
    
    void Edit(SeqList *L);          //修改子菜单
    void Delete(SeqList *L) ;       //删除子菜单
    void Search(SeqList *L);        //查找子菜单
    void Sort(SeqList *L);             //排序子菜单
    
    
    /功能函数
    void Add(SeqList *L);              //添加人员信息
    void PrintList(SeqList *L);         //显示全体人员信息
    void PrintList(SeqList *L,int i);   //显示单个人员信息
    void Total(SeqList *L);             //统计人员数量
    
    void Edit_num(SeqList *L);    //按编号修改
    void Edit_name(SeqList *L);    //按姓名修改
    void Delete_num(SeqList *L);      //按编号删除
    void Delete_name(SeqList *L);     //按姓名删除
    void Save(SeqList *L);            //存文件
    void Read(SeqList *L);            //读文件
    void Search_name(SeqList *L);     //按姓名查找
    void Search_num(SeqList *L);      //按编号查找
    void InsertSort(SeqList *L);      //折半插入排序
    void BubbleSort(SeqList *L);      //冒泡排序
    
    
    int main()
    {
    	printf("                    ###     欢迎进入人员管理系统      ###\n");
    	//顺序表初始化//
    	SeqList   *L;    ///
    	L=(SeqList *)malloc(sizeof( SeqList));   //分配内存
    	L->length=0;
    
    	int choice=1;
    	while(choice!=0)
    	{
    		printf("ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");
    		printf("|                                                                             |\n");
    		printf("|1.添加  2.查找  3.修改  4.统计  5.删除  6.显示  7.保存 8.读取  9.排序  0.返回|\n");
    		printf("|                                                                             |\n");
    		printf("ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");
    		printf("输入您操作的选项:");
    	        scanf("%d",&choice);
            	switch(choice)
    		{
    			case 1:Add(L);  //添加人员信息
    				   break;
    			case 2:Search(L);
    				   break;	
    			case 3:Edit(L);//修改
    				   break;
    			case 4:Total(L);   //人员数量统计
    				   break;
    			case 5:Delete(L);
    				   break;
    			case 6:PrintList(L);  //显示所有人员信息
    				   break;
    			case 7:Save(L);//保存
    				   break;
    		    case 8:Read(L);            //读文件
    				   break;
    			case 9:Sort(L);//排序
    				   break;
    			case 0:free(L);   //释放内存
    				   printf("退出成功!\n");
    				   break;
    			default:
    				   printf("无此选项,请重试!\n");
    				   break;
    		}
    	}
    
    	printf("                     ooooo欢迎您使用本系统!ooooo\n");
        return 0;
    }
    
    void Add(SeqList *L)          //添加人员
    {   
    	if(L->length>=MaxSize) 
        {printf("空间已满,不能添加!!!\n");
          return;
         }
                     
        printf("正在添加人员......\n");
        printf("请输入数据(工号  姓名  性别(0或1) 联系电话  QQ号):\n");
    	scanf("%d%s%d%s%s",&L->list[L->length].no,L->list[L->length].name , &L->list[L->length].sex , L->list[L->length].tel  ,L->list[L->length].qq);
        //下面代码保证编号唯一性//
        for(int i=0;i<L->length;i++)	
        {if(L->list[L->length].no==L->list[i].no)
         {	printf("该编号已存在,添加失败!\n");
    	    return ;
          }
         }
        printf("添加成功!!!\n\n");
        L->length++;     // 调整人员个数
    }
    
    /***显示顺序表中数据***/
    void  PrintList(SeqList *L)
    {	if (L->length==0) {printf("没有人员信息!\n");return;}
        int i;
    	printf("学号    姓名    性别    电话    QQ号\n");
    	for( i=0 ;  i<L->length ; i++)
    	{	printf("%d\t%s\t",L->list[i].no,L->list[i].name );                                                               
    		if(L->list[i].sex)
    		 printf("男");
    		else printf("女");
    		printf("\t%s\t%6s\n",  L->list[i].tel  ,L->list[i].qq);   
    	}
    }
    
    void  PrintList(SeqList *L,int i)   //显示第i个人员信息
    {	
    	if(i<0||i>L->length-1)
    	{
    	   printf("输出错误!\n");
    	   return;
    	}
    	printf("学号    姓名    性别    电话    QQ号\n");
    	printf("%d\t%s\t",L->list[i].no,L->list[i].name );                                                               
    	if(L->list[i].sex)
    		 printf("男");
    	else printf("女");
    	printf("\t%s\t%6s\n",  L->list[i].tel  ,L->list[i].qq);   
    
    }
    
    void Total(SeqList *L)         //统计人员数目
    {
    
    	printf("公司人员总人数为:%d人\n",L->length);
    }
    
    修改功能/
    /
    void Edit(SeqList *L)          //修改子菜单
    {
    	if (L->length==0) {printf("没有人员信息!\n");return;}
    	int choice=1;	
    	do{
    		printf("                    ooooo编辑ooooo\n");
    		printf("||                                                        ||\n");
    		printf("||        1 : 按工号       2 : 按姓名       0 :退出       ||\n");
    		printf("||                                                        ||\n");
    		printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");
    		printf("请输入您的选择:");
    		scanf("%d",&choice);
    		switch(choice)
    		{
    			case 1:Edit_num(L);
    				   //printf("按工号修改!\n");
    				   break;
    			case 2:Edit_name(L);
    				   //printf("按姓名修改!\n");
    				   break;
    			case 0:printf("您已安全退出子菜单!\n");
    				   break;
    			default:printf("没有此选项,请重选!\n");
    				    break;
    		}
    	}while(choice!=0);
    }
    
    //按人员编号修改记录信息
    void Edit_num(SeqList *L)        
    {
      int x;
      printf("请输入要修改的人员的编号:");
      scanf("%d",&x);
      for(int i=0;i<L->length;i++)
       {
    	  if(L->list[i].no==x)
    	  {
    		PrintList(L,i);
    		printf("\n");
    
    		printf("请输入数据(工号  姓名  性别(0或1) 联系电话  QQ号):\n");
    	    scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);
       
    		while(L->list[i].no!=x)
    		{
    			printf("编号不能修改!");
    		    printf("请输入数据(工号  姓名  性别(0或1) 联系电话  QQ号):\n");
    	        scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);
    		}
    
    		printf("修改成功!\n");
    		PrintList(L,i);
            return;
    	  }
    	}
       printf("该人员不存在!\n");
    }
    
    //按姓名修改记录信息————需要处理重名情况
    void Edit_name(SeqList *L)     
    {
      char nam[20],c1;
      printf("请输入要编辑的人员的姓名:");
      scanf("%s",nam);
      for(int i=0;i<L->length;i++)
      {
    	if(strcmp(L->list[i].name,nam)==0)
    	{   int n=L->list[i].no;
    	    PrintList(L,i);
    	    printf("\n");
    		printf("要修改这条记录吗?(是:y/Y,否:n/N):");
    	    fflush(stdin); 
    	    scanf("%c",&c1);
    	    if(c1=='y'||c1=='Y') 
    		{
             printf("请输入数据(工号  姓名  性别(0或1) 联系电话  QQ号):\n");
    	     scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);
    	     while(L->list[i].no!=n)
    		 {
    		    printf("编号不能修改!");
    		    printf("请输入数据(工号  姓名  性别(0或1) 联系电话  QQ号):\n");
    	        scanf("%d%s%d%s%s",&L->list[i].no,L->list[i].name , &L->list[i].sex , L->list[i].tel,L->list[i].qq);
    	     }
    	     printf("修改成功!\n");
    		 PrintList(L,i);
        	 return ;
    		}
    	} 
      } 
       printf("该人员不存在!\n");
    }
    
    删除功能/
    /
    void Delete(SeqList *L)             //删除子菜单
    {
        if (L->length==0) {printf("没有人员信息!\n");return;}
    	int choice;	
    	do{
        	        printf("                    ooooo删除ooooo\n");
    		printf("||                                                        ||\n");
    		printf("||        1 : 按工号       2 : 按姓名       0 :退出       ||\n");
    		printf("||                                                        ||\n");
    		printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");
    		printf("请输入您的选择:");
    		scanf("%d",&choice);
    		switch(choice)
    		{
    			case 1:Delete_num(L);
    				   break;
    			case 2:Delete_name(L);
    				   break;
    			case 0:printf("您已安全退出删除功能!\n");
    				   break;
    			default:printf("没有此选项,请重选!\n");
    				    break;
    		}
    	}while(choice!=0);
    }
    
    void Delete_num(SeqList *L)          /按编号进行删除
    { 
    	char c1;
    	int x;
        printf("请输入要删除的技术人员的编号:");
        scanf("%d",&x);
        for(int i=0;i<L->length;i++)
        {
    	  if(L->list[i].no==x)
    	  {
    			PrintList(L,i);                    
    			break;
    		}
    	}	 
         if(i>=L->length)
    	 {
    		    printf("无此技术人员!");
                return ;
    	 } 
    	
        printf("是否删除此项(是:y/Y,否:n/N):");
    	fflush(stdin); 
    	scanf("%c",&c1);
    	if(c1=='y'||c1=='Y')
    	{
    		for(int k=i;k<L->length-1;k++)
    		{
    			L->list[k]=L->list[k+1];               //从i开始,后往前覆盖
    		}
    		printf("删除成功!\n");
    		L->length--;                         //人数减一
    		return ;
    	}
    	else
    		printf("没有删除该技术人员!\n");
    }
    void Delete_name(SeqList *L)                  /按姓名进行删除---有重名情况
    { 
    	char c1;
        char nam[20];
    	printf("请输入要删除的技术人员的姓名:");
        scanf("%s",nam);
    	for(int i=0;i<L->length;i++)
    	{
    	  if(strcmp(L->list[i].name,nam)==0)
    	  { 
    			PrintList(L,i);
                printf("要删除这条记录吗?(是:y/Y,否:n/N):");
    	        fflush(stdin); 
    	        scanf("%c",&c1);
    	        if(c1=='y'||c1=='Y') break;
    	  }
    	}	 
       	if(i>=L->length)
    	 {
    	    printf("无此技术人员!");
            return ;
    	 } 
    	
        printf("再次确认删除该记录?(是:y/Y,否:n/N):");
    	fflush(stdin); 
    	scanf("%c",&c1);
    	if(c1=='y'||c1=='Y')
    	{	for(int k=i;k<L->length-1;k++)                     //删除
    		{
    			L->list[k]=L->list[k+1];
    		}
    		printf("删除成功!\n");
    		L->length--;                         //人数减一            
    		return ;
    	}
    	else
    		printf("没有删除该技术人员!\n");
    }
    /
    
    void Save(SeqList *L)                  /存文件
    {
    
       FILE *fp = NULL;
       fp = fopen("D:\\人员管理.txt", "w");
       if(!fp)
       {    printf("文件打开出错\n");
            return;
       }
       
       for (int i=0;i<L->length;i++)
    	{
    		fprintf(fp,"\n%d\t",L->list[i].no);		//写进磁盘保存,以下同理
    		fprintf(fp,"%s\t",L->list[i].name);
    		fprintf(fp,"%d\t",L->list[i].sex);
    		fprintf(fp,"%s\t",L->list[i].tel);
    		fprintf(fp,"%s",L->list[i].qq);
    	
    	}
          
       printf("保存成功!\n");
       fclose(fp);
    
    }
    
    
    void Read(SeqList *L)                  /读文件
    {
       FILE *fp = NULL;
       fp = fopen("D:\\人员管理.txt", "r");
       if(!fp)
       {    printf("文件打开出错\n");
            return;
       }
       int i=0;
       while(!feof(fp))
       {
       fscanf(fp, "%d%s%d%s%s", &L->list[i].no,L->list[i].name,&L->list[i].sex,L->list[i].tel,L->list[i].qq);
       i++;
       }
       L->length=i;
       printf("读取成功!\n");
       fclose(fp);
    }
    
    /
    void Search(SeqList *L)              //查找子菜单
    {
        if (L->length==0) {printf("没有人员信息!\n");return;}
    	int choice;
    	do{
        	printf("                    ooooo查找ooooo\n");
    		printf("||                                                        ||\n");
    		printf("||        1 : 按工号       2 : 按姓名       0 :退出       ||\n");
    		printf("||                                                        ||\n");
    		printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");
    		printf("请输入您的选择:");
    		scanf("%d",&choice);
    		switch(choice)
    		{
                case 1:Search_num(L);
    				   break;
    			case 2:Search_name(L);
    				   break;
    			case 0:printf("您已安全退出查找功能!\n");
    				   break;
    			default:printf("没有此选项,请重选!");
    				   break;
    		}
    	}while(choice!=0);
    }
    
    void Search_num(SeqList *L)                        //按编号进行查找
    {
      int x;
      printf("请输入要查找的人员的编号:");
      scanf("%d",&x);
      for(int i=0;i<L->length;i++)
        {
    	  if(L->list[i].no==x)
    	  {
    	  printf("oooooooooooo找到这个人员了,其信息为:oooooooooooo\n");	
    	  PrintList(L,i);      
          return;
    	}	
      } 
      printf("该技术人员不存在!\n");
    }
    void Search_name(SeqList *L)                      //按姓名进行查找
    {   int flag=0;
        char nam[20];
    	printf("请输入要查找的人员的姓名:");
        scanf("%s",nam);
    	for(int i=0;i<L->length;i++)
    	{
    	  if(strcmp(L->list[i].name,nam)==0)
    	  { 
    	  if(flag) 
    		   printf("oooooooooooo又找到了一个,其信息为:oooooooooooo\n");
    	  else 
    		   printf("oooooooooooo   找到了,其信息为:   oooooooooooo\n");
    	  PrintList(L,i); 
          flag=1;
    	  }	
    	}
       if(!flag) printf("该人员不存在!\n");
    }
    
    ///
    void Sort(SeqList *L)              //排序子菜单
    {
        if (L->length==0) {printf("没有人员信息!\n");return;}
    	int choice;
    	do{
        	printf("                    ooooo排序ooooo\n");
    		printf("||                                                        ||\n");
    		printf("||     1 : 插入排序       2 : 冒泡排序      0 :退出       ||\n");
    		printf("||                                                        ||\n");
    		printf("oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\n");
    		printf("请输入您的选择:");
    		scanf("%d",&choice);
    		switch(choice)
    		{
                case 1:InsertSort(L);
    				   break;
    			case 2:BubbleSort(L);
    				   break;
    			case 0:printf("您已安全退出排序功能!\n");
    				   break;
    			default:printf("没有此选项,请重选!");
    				   break;
    		}
    	}while(choice!=0);
    }
    
    ///折半插入排序算法///
    void InsertSort(SeqList *L)
    {  int i, j, low, high, mid ;  
       ElemType temp;
       for (i=1; i<L->length; i++)
       {  temp= L->list[i];      
          low=0 ; high=i-1 ; 
          while (low<=high)
          {    mid=(low+high)/2;
               if ( temp.no< L->list[mid].no)  
    				high=mid-1 ;
               else low=mid+1 ; 
    	  }       /*   查找插入位置   */
          for (j=i-1; j>=high+1; j--)  L->list[j+1]=L->list[j]; 
          L->list[high+1]=temp;  /*   插入到相应位置   */
       }
       printf("排序完毕!\n");
       PrintList(L); 
    
     }
    //冒泡排序///
    void BubbleSort(SeqList *L)
    {  int i,j,over;
        ElemType p;
    	for(i=0;i<L->length-1;i++)
    	{
    		over=1;
    		for(j=1;j<L->length-i;j++)
    		{
    			if(L->list[j].no<L->list[j-1].no)
    			{	p=L->list[j];
    				L->list[j]=L->list[j-1];
    				L->list[j-1]=p;
    				over=0;
    			}
    		}
    	    if(over) break;
    	}
       printf("排序完毕!\n");
       PrintList(L); 
    } 
    

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值