用c语言实现简单的项目信息管理系统(单向链表实现)

这个其实是我之前为了进入学校的实验室而写的一个小项目,关于需要实现的功能(在菜单里)和具体思路就都写在代码里了,所以直接看完整的代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<malloc.h>
#include<ctype.h>
typedef struct project{
	char progname[50];
	char host[50];
	char members[100];
	char conductor[50];
	int membernum;
	char progkind[50];
	char prognum[50];
	struct project *next; 
}PROJECT;
 
//定义一些全局变量
char prognam[50];
char hos[50];
char member[100];
char conducto[50];
int membernu;
char progkin[50];
char prognu[50];

//针对输入非法的改正 
int check1()
{
	while (true)
	{
		char s[50];
		scanf("%s", s);
		int res = 0;
		bool flag = true;
		for (int i = 0; i < strlen(s); i ++ ) {
			if (s[i] >= '0' && s[i] <= '9')
			{
				res = res * 10 + s[i] - '0';
			}
			else
			{
				flag = false;
			}
		}
		if (flag == false) printf("输入非法! 请重新输入:");
		else
		{
			return res;
		}
	}
}

int check2()
{
	while (true)
	{
		char s[50];
		scanf("%s", s);
		int res = 0;
		bool flag = true;
		for (int i = 0; i < strlen(s); i ++ ) {
			if (s[i] >= '0' && s[i] <= '9')
			{
				res = res * 10 + s[i] - '0';
			}
			else
			{
				flag = false;
			}
		}
		if (flag == false || res >= 9) printf("输入非法! 请重新输入一个1-8的数字:");
		else
		{
			return res;
		}
	}
}
 
//随机输入一个七个字符长度的项目编号 
char*prognumBuild()
{
	char mysql1[]="0123456789";
	char mysql2[]="abcdefghljklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
	int i;
	int num_size1;
	int num_size2;
	int random;
	char *prognum=(char *)malloc(sizeof(char));
	srand((unsigned)time(NULL));
	num_size1=rand()%1+6;
	num_size2=rand()%1+1;
	for(i=0;i<num_size2;i++)
	{
		random=rand()%(strlen(mysql2));
		*(prognum+i)=mysql2[random];
	}
	for(i=num_size2;i<7;i++)
	{
		random=rand()%(strlen(mysql1));
		*(prognum+i)=mysql1[random];
	}
 
	return prognum;
}
 
void menu()/* 菜单界面*/
{
	 printf("\t\t\t  **************************************************\n\n");
	 printf("\t\t\t  *                学生信息管理系统                   * \n\n");
	 printf("\t\t\t  ******************************************************\n\n"); 
	 printf("\t\t\t*********************系统功能菜单*************************\n");
	 printf("\t\t\t     ----------------------   ----------------------  \n");
	 printf("\t\t\t     *********************************************  \n");
	 printf("\t\t\t     * 1.插入项目信息   *   \n");
	 printf("\t\t\t     *********************************************  \n"); 
	 printf("\t\t\t     * 2.降序输出项目信息    * *  3.删除学生信息   *   \n");
	 printf("\t\t\t     *********************************************  \n");
	 printf("\t\t\t     * 4.按项目编号修改学生信息   * *  5.按项目类别查询信息 *  \n");
	 printf("\t\t\t     *********************************************  \n");
	 printf("\t\t\t     * 6.按项目编号查询信息  * *  7.显示更新后的所有项目信息*\n");
	 printf("\t\t\t     ********************** **********************  \n");
	 printf("\t\t\t     * 8.退出系统        *        \n");
	 printf("\t\t\t     **********************        \n");
	 printf("\t\t\t     ----------------------   ----------------------  \n");
}
 
//关于第3,4,6个功能要求支持模糊搜索(就是输入一个关键字,相关的项目信息都会显示出来)
 
void InitList(PROJECT *&L)//初始化链表  
{  
    L=(PROJECT *)malloc(sizeof(PROJECT));  
    L->next=NULL;  
}
 
//查找尾结点
PROJECT *findLast(PROJECT *L)
{
	PROJECT *pt;
	pt=L;
	while(pt->next!=NULL)
	{
		pt=pt->next;
	}
	return pt;
}
 
//插入项目信息
void prog_add(PROJECT *&L)
{ 
	PROJECT *prePt,*pt;
	pt=(PROJECT *)malloc(sizeof(PROJECT));
	printf("项目名为:");
    scanf("%s",prognam);
	strcpy(pt->progname,prognam);
	printf("负责人为:");
	scanf("%s",hos);
	strcpy(pt->host,hos);
	printf("队员为:");
	scanf("%s",member);
	strcpy(pt->members,member);
	printf("指导老师为:");
	scanf("%s",conducto);
	strcpy(pt->conductor,conducto);
	printf("队员人数为:");
	membernu = check1();
	pt->membernum=membernu;
	printf("项目类型为:");
	scanf("%s",progkin);
	strcpy(pt->progkind,progkin);
	printf("项目编号为:%s\n",prognumBuild());
	strcpy(pt->prognum,prognumBuild());
	prePt=findLast(L);
	prePt->next=pt;
	pt->next=NULL;
	printf("增加成功!\n");
 } 
 
 //浏览全部项目信息 
 void display(PROJECT *&L)
{  
    PROJECT *pt=L->next;  
    if(pt==NULL)  
    {  
        printf("还没有项目信息,请增加项目信息!\n");  
        return;  
    }  
    while(pt)  
    {   
  			printf("项目名为:%s\t",pt->progname);
			printf("负责人为:%s\t",pt->host);
			printf("队员为:%s\t",pt->members);
			printf("指导老师为:%s\t",pt->conductor);
			printf("队员人数为:%d\t",pt->membernum);
			printf("项目类别为:%s\t",pt->progkind);
			printf("项目编号为:%s\n",pt->prognum);
			pt=pt->next;
    }  
}
 
//按项目编号降序输出项目信息
void low_print(PROJECT *L) 
{
	PROJECT *p,*q,*r;
	r=L->next;
	while(r!=NULL)
	{
		p=r;
		q=r->next;
		PROJECT *temp;
		InitList(temp);
		while(q!=NULL)
		{
			if(strcmp(p->prognum,q->prognum)<0)
			{
				//项目名 
				strcpy(temp->progname,p->progname);
				strcpy(p->progname,q->progname);
				strcpy(q->progname,temp->progname);
				//负责人 
				strcpy(temp->host,p->host);
				strcpy(p->host,q->host);
				strcpy(q->host,temp->host);
				//队员 
				strcpy(temp->members,p->members);
				strcpy(p->members,q->members);
				strcpy(q->members,temp->members);
				//指导老师 
				strcpy(temp->conductor,p->conductor);
				strcpy(p->conductor,q->conductor);
				strcpy(q->conductor,temp->conductor);
				//队员人数 
				temp->membernum=p->membernum;
				p->membernum=q->membernum;
				q->membernum=temp->membernum;
				//项目类型 
				strcpy(temp->progkind,p->progkind);
				strcpy(p->progkind,q->progkind);
				strcpy(q->progkind,temp->progkind);
				//项目编号 
				strcpy(temp->prognum,p->prognum);
				strcpy(p->prognum,q->prognum);
				strcpy(q->prognum,temp->prognum);
			}
			q=q->next;
		}
		r=r->next;
	}
	printf("排序后的项目信息为:\n");
	display(L);
	
}
 
//模糊搜索,按项目编号删除项目信息
void prog_delete(PROJECT *L)
{
	char ch[10];
	PROJECT *pt,*prePt;
	prePt=L;
	pt=prePt->next;
	printf("请输入一个关键字:");
	scanf("%s",&ch);
	int flag=0;
	while(pt!=NULL)
	{
		if(strstr(pt->prognum,ch)!=NULL)
		{
			printf("需要删除项目的项目编号为:%s\n",pt->prognum);
			prePt->next=pt->next;
			free(pt);
			flag=1;
			break;
		}
		else
		{
			prePt=pt;
			pt=pt->next;
		}
	}
	if(flag==1)
	{
		printf("删除项目信息成功!\n");
	}
	else
	{
		printf("抱歉,未找到相关的项目信息!\n");
	}
}
 
//模糊搜索,按项目编号修改项目信息 
void prog_change(PROJECT *L)
{
	char ch[10];
	PROJECT *pt;
	pt=L->next;
	printf("请输入一个关键字:\n");
	scanf("%s",&ch);
	int flag=0;
	while(pt!=NULL)
	{
		if(strstr(pt->prognum,ch)!=NULL)
		{
			printf("%s",pt->prognum);
			flag=1;
			printf("请输入需要修改的项目信息:(1.项目名 2.负责人 3.队员 4.指导老师 5.队员人数 6.项目类别)\n");
			int choose;
			scanf("%d",&choose);
			switch(choose)
			{
				case 1:
					printf("请输入您要修改的项目名:\n");
					scanf("%s",prognam);
					printf("修改后的项目名为:%s\n",prognam);
					strcpy(pt->progname,prognam);
					printf("修改成功!\n");
					break;
				case 2:
					printf("请输入您要修改的负责人:\n");
					scanf("%s",hos);
					printf("修改后的负责人为:%s\n",hos);
					strcpy(pt->host,hos);
					printf("修改成功!\n");
					break;
				case 3:
					printf("请输入您要修改的队员:\n");
					scanf("%s",member);
					printf("修改后的队员为:%s\n",member);
					strcpy(pt->members,member);
					printf("修改成功!\n");
					break;
				case 4:
					printf("请输入要修改的指导老师:\n");
					scanf("%s",conducto);
					printf("修改后的指导老师为:%s\n",conducto);
					strcpy(pt->conductor,conducto);
					printf("修改成功!\n");
					break;
				case 5:
					printf("请输入要修改的队员人数:\n");
					scanf("%d",&membernu);
					printf("修改后的队员人数为:%d\n",membernu);
					pt->membernum=membernu;
					printf("修改成功!\n");
					break;
				case 6:
					printf("请输入要修改的项目类别:\n");
					scanf("%s",progkin);
					printf("修改后的项目类别为:%s\n",progkin);
					strcpy(pt->progkind,progkin);
					printf("修改成功!\n");
					break;
				default :
					printf("请重新输入1-6的数字\n");
					break;
			}
		}
		pt=pt->next;
	}
	if(flag==0)
	{
		printf("抱歉,未找到相关的项目信息!\n");
	}
}
 
//按项目类别查询项目信息
void kind_search(PROJECT *L)
{
	int flag=0;
	PROJECT *pt;
	pt=L->next;
	printf("请输入相关项目类别,便于您查找相关项目信息:\n");
	char s[100];
	scanf("%s",s);
	while(pt!=NULL)
	{
		if(strcmp(s,pt->progkind)==0)
		{
			flag=1;
			printf("该项目的项目名为:%s\n",pt->progname);
			printf("该项目的负责人为:%s\n",pt->host);
			printf("该项目的队员为:%s\n",pt->members);
			printf("该项目的指导老师为:%s\n",pt->conductor);
			printf("该项目的队员人数为:%d\n",pt->membernum);
			printf("该项目的项目编号为:%s\n",pt->prognum);
			break;
		}
		else
		{
			pt=pt->next;
		}
	}
	if(flag==0)
	{
		printf("抱歉,未找到相关的项目信息!\n");
	}
 } 
 
 //模糊搜索,按项目编号查询项目信息 
void num_search(PROJECT *L)
{
	char ch[10];
	PROJECT *pt;
	pt=L->next;
	printf("请输入一个关键字:");
	scanf("%s",ch);
	int flag=0;
	while(pt!=NULL)
	{
		if(strstr(pt->prognum,ch)!=NULL)
		{
			flag=1;
			printf("%s\n",pt->prognum);
			printf("该项目的项目名为:%s\n",pt->progname);
			printf("该项目的负责人为:%s\n",pt->host);
			printf("该项目的队员为:%s\n",pt->members);
			printf("该项目的指导老师为:%s\n",pt->conductor);
			printf("该项目的队员人数为:%d\n",pt->membernum);
			printf("该项目的项目类别为:%s\n",pt->progkind);
		}
		pt=pt->next;
	}
	if(flag==0)
	{
		printf("抱歉,未找到相关的项目信息!\n");
	}
}
 
//将项目信息保存在文本文件中 
void  saveProjectFile(PROJECT *&L)
{
	FILE *fp;
	PROJECT *pt;
	pt=L->next;
	if((fp=fopen("project.txt","w"))==NULL)//对文件进行写操作 
	{
		printf("文件不能打开!\n");
		exit(0);
	}
	while(pt!=NULL)
	{
		fprintf(fp,"%s %s %s %s %d %s %s\n",pt->progname,pt->host,pt->members,pt->conductor,pt->membernum,pt->progkind,pt->prognum);
		pt=pt->next;
		printf("保存成功!\n");
	}
	fclose(fp);
}
 
 
 
int main()  
{       
	PROJECT *L;  
    InitList(L);
    printf("请输入需要管理的项目信息数量:");
	int n = check1();
    for(int i = 0; i < n; i ++ )
    {
    	printf("请输入第%d个项目的相关信息:\n",i+1);
    	prog_add(L);
	}
	int choose,x;  
    while(1)  
    {
    	menu();
  		printf("\n");
  		printf("请输入您的选择:\n"); 
		choose = check2();
        switch(choose)  
        {  
        	case 1:
				prog_add(L);
				break; 
			case 2:
				low_print(L);
				break;
			case 3:
				prog_delete(L);
				break;
			case 4:
				prog_change(L);
				break;
			case 5:
				kind_search(L);
				break;
			case 6:
				num_search(L);
				break;
			case 7:
				display(L);
				saveProjectFile(L);
				break;
			case 8:
				printf("谢谢使用!\n");
				exit(0);
			default:
				break;
        }  
    } 
 	return 0;
}  

这是我大一上学期期中时写的项目,所以可能会有许多还可以改进的地方,如果小伙伴们有什么更好的建议,欢迎在评论区写下你们的宝贵建议,谢谢各位小伙伴!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值