⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fun.c

📁 这是一个基于控制台的彩票管理系统
💻 C
字号:
/**一些函数*****/
/****************************************/
/***********输入函数*********************/
/***************************************/
#include "head.h"
DATA *input()
{	
	int i,n,j,t;
	DATA *small, *nex, *out, *outhead;
	n=1;
	count=0;
	p1=(DATA*)malloc(LEN);
	p2=p1;
	printf("注意\n输入彩票号码的期号2004001,即代表2004年第一期\n");
	while(1)
	{    
		printf("\n***************************\n");
		printf("期号小于等于0结束输入\n输入彩票号码的期号:\n");
		scanf("%ld",&p1->name);/**期号小于等于0结束输入**/
		if(p1->name<=0)
		{
			 break;
		}
		count++;/***记录彩票号码的个数******/
		printf("输入各期号码,仅有8个号码,第八个是特别号.\n之后按回车键继续输入下期号码:\n");
		for(i=0;i<=7;i++)
		{ 
			 scanf("%d",&p1->number[i]);		
             if(p1->number[i]<=0)
			 {
				 printf("号码应大于0!请重新输入该码:\n");
				 i=-1;
			 }
	 	
		 }
        /*****对号码由小到大排序,气泡法******/
		for(i=1;i<8;++i)
			for(j=7;j>=i;--j)
			{   
				if(p1->number[j-1]>p1->number[j])
				{
					t=p1->number[j-1];
					p1->number[j-1]=p1->number[j];
					p1->number[j]=t;
				}
			} /*****对号码排序已完毕******/
		if(n==1)
			head=p1;
        else 
			p2->next=p1;
        p2=p1;
		if((p1=(DATA*)malloc(LEN))==NULL)/**申请下一个空间**/
		{   
			printf("内存不足,链表创建失败!按任意键返回\n");
            getch();
            return(NULL);
		}
	    n=n+1;
	}/**while****循环结束****/
	if(p1->name<=0&&n==1)/**没有数据***/
		{
			 return(NULL);
		}
	p2->next=NULL;/****彩票号码导入原链表结束****/
/*******对裁彩票号码按期号由小到大排序***/
	small=head;
	if(n==2&&small->next==NULL)/**只有一个数据**/
	{
		outhead=small;
		return(outhead);
	}
	/***找到最小彩票期号地址small***/
	n=0;
	while(count!=0)
	{	
		small=head;
        nex=small->next;
		if(nex==NULL)break;
		for(j=1;j<count;j++)/**也可以说是选择法**/
			if(small->name<=nex->name)
			{  
				nex=nex->next;
			    if(nex==NULL)break;
			}
			else
			{
				small=nex;nex=nex->next;
				if(nex==NULL)break;  
			}
         
		/***找到最小彩票期号地址small导到输出表outhead***/	  
		 n++;
		if(small->next==NULL)
		{
			outhead=small;
			return (outhead);
		}
		if(n==1)
			outhead=out=small; /**第一个结点***/
		else 
		{ 
			out->next=small;
			out=small;
		}
		/***删除函数原链表中的small******/ 
	    p1=head;
		p2=p1;
	    if(small->name==p1->name)/*删除的是第一个结点*/
			if(p1->next==NULL)
				;/**空语句**/
			else  
				head=p1->next;
		while(small->name!=p1->name)/***不相等则退出****/
		{  
           p2=p1;p1=p1->next;
		}
        p2->next=p1->next;/***删除函数原链表中的small完毕******/
	}/**while该循环结束**/
	out->next=small;
	small->next=NULL; /**最后一个结点***/              
	return(outhead);/***返回新的链表头指针**/
}
/*********************************/
/********输出函数*****************/
/********************************/

void print_perf(DATA *head)
{	
	int i,j;
	i=1;
	j=1;
	if(head==NULL)
	{
		printf("没有任何数据,按任意键返回主菜单:\n");
		printf("*****************************\n");
        getch();
        return;
	}
	else 
		printf("输出以下结果:\n");
	printf("期号**************各期号码\n");
	p1=head;/*指向头指针*/
	while(p1!=NULL)
	{	
		printf("%ld      ",p1->name); 
		for(j=0;j<=7;j++)
			printf("%4d",p1->number[j]);
		printf("\n");
		p1=p1->next;/*下一个结点**/
	}
	printf("any key to return\n");
	getch();
	return;
}
 /*************************************************/
/**************保存函数***************************/
/**********************************************/


 void save(DATA *head)
{
	printf("input the file name:\n");
	scanf("%s",filename);
	if((fp=fopen(filename,"wb"))==NULL)
	{	
		printf("文件打开失败,按任意键返回菜单\n");
		getch();
		return;
	}
	p1=p2=head;/*指向头指针*/
	while(p1!=NULL)
	{	
		if(fwrite(p1,sizeof(DATA),1,fp)!=1)
		{
			printf("shi bai\n");
			getch();
			return;
		}
		p1=p1->next;/*下一个结点**/
	}
	fclose(fp);
	printf("saved,input any key to return menu:\n");
	getch();
}

/***********************************************/
/***************插入函数***********************/
 /********************************************/

 DATA *insert_perf(DATA *head)
{	
	DATA *p3=NULL;
	int i,j,t,m;
	m=1;
	p1=head;
	p2=head;
	while(m!=0)
	{	/**申请一个新空间,已存放插入的数据**/
		if((p3=(DATA *)malloc(LEN))==NULL)
			{	
				printf("\n");
				getch(); 
				return NULL;
			} 
		printf("请输入号码的期号:\n");
		scanf("%d",&p3->name);
		printf("请输入各个号码:\n");
		for(i=0;i<=7;i++)
		scanf("%d",&p3->number[i]);
 /*****对号码由小到大排序,气泡法******/
		for(i=1;i<8;++i)
			for(j=7;j>=i;--j)
		   {   
				if(p3->number[j-1]>p3->number[j])
				{
					t=p3->number[j-1];
			        p3->number[j-1]=p3->number[j];
                    p3->number[j]=t;
				}
		   }
        /*****对号码排序已完毕******/

		if(head==NULL)/**原链表没有一个数据**/
		{
			head=p3;
			p3->next=NULL;
		}
		else
		{/*原彩票数据都是按有小到大排序的*/
			/*大于则后移**/
			while((p3->name>p1->name)&&(p1->next!=NULL))
				{
					p2=p1;
					p1=p1->next;
				}
			/**不是插入到最后则小于等于则前插**/
			if(p3->name<=p1->name)
				{
					/**原链表只有一个结点**/
					if(head==p1)
					{
						head=p3;p3->next=p1;
					}
					/**原链表不止有一个结点**/
					else 
					{
						p2->next=p3;p3->next=p1;
					}
				}
			/*该数据是最大的 插入到最后**/
			else
			{
				p1->next=p3;p3->next=NULL;
			}
		}
		printf("插入成功!想继续插入吗?按数字0退出,按数字1继续\n");
		scanf("%d",&m);
	}/*while循环结束**/
	return(head);
}

 /********************************/
 
 /*****载入函数*********************/

 /************************************/
 
 DATA *openfile(void)
 {  
	int i,n,m;
    i=1;
	m=1;
    printf("输入文件名:\n");
    scanf("%s",filename);
	/*文件打开*/
	if((fp=fopen(filename,"rb"))==NULL)
	{ 
		printf("文件打开失败,按任意键返回\n");
		getch();
		return(NULL);
	}
    /**申请一个新空间**/
	if((p1=p2=(DATA*)malloc(LEN))==NULL)
	{ 
		printf("内存不足,链表创建失败!按任意键返回\n");
		getch();
		return(NULL);
	}
   /**读取整块数据**/
	if(fread(p1,sizeof(DATA),1,fp)!=1)
   {  
		printf("文件导入失败,按任意键返回\n");
		getch();
		return(NULL);
   }
   /*只有一个结点*/
	if(p1->next==NULL)
	{  
		head=p1;
		fclose(fp); 
		printf("文件载入成功,按任意键返回\n");
        getch();
		return(head);
   }
   /*有多个结点*/
	else
	{
	   while(p1->next!=NULL)
		{	if(n==1)
				head=p1;/**表头**/
			else 
				p2->next=p1;/*下一个结点*/
			n=n+1;
			p2=p1;/**p2比p1落后一个**/
			 /**申请下一个新空间**/
			if((p1=(DATA*)malloc(LEN))==NULL)
			{  
				printf("内存不足,链表创建失败!按任意键返回\n");
				getch();
				return(NULL);
			}
			/**读取下一整块数据**/
			if(fread(p1,sizeof(DATA),1,fp)!=1)
			{	printf("文件导入失败,按任意键返回\n");
				getch();
				return(NULL);
			}
		}/*while循环结束*/
		p2->next=p1;
	}/*else结束*/
	fclose(fp);
	printf("文件载入成功,按任意键返回\n");
	getch();
	return(head);
}/**函数结束**/

 /*****************************************************************************/
/***********删除函数**********************************************************/
/*************************************************************************/
 
 DATA * del_perf( DATA * head)

{	long int m;
	int n=1;
	
	if(head==NULL)/**没有数据**/
	{
		printf("没有任何号码可被删除,按任意键返回!\n");
		getch();
		return(head);
	}
	while(n==1)
	{	printf("输入想删除的彩票号码的期号\n");
		scanf("%ld",&m);
		p1=head;/**指向头指针**/
		p2=p1;
		/*删除的是第一个结点*/
		if(m==p1->name)
		{	/*只有一个结点*/
			if(p1->next==NULL)
			{ 
				head=p1=p2=NULL;
				printf("只有一期号码已被删除,按任意键返回!\n");
				getch();
				return(head);
			}
			/*不只有一个结点*/
			else
			{   
				head=p1->next;
			}
		}/****/
		/*删除的不是第一个结点*/
		while(m!=(p1->name))/**相等退出**/
		{	/**最后一个结点都没有找到相应的期号**/
			if(p1->next==NULL)
			{
				printf("没找到相应的期号,按任意键返回!\n");
				getch();
				return(head);
			}
			/*否则p1,p2后移**/
			else
			{
				p2=p1;p1=p1->next;
			}
		}
		p2->next=p1->next;/**末尾处理**/
		printf("已被删除\n继续删除请按'1'键,按'0'键返回主菜单!");
		scanf("%d",&n);
	}/*大的while循环结束*/
	return(head);
}/*该函数结束*/

/************************************************************************/
/****修改函数**********************************************************/
/*********************************************************************/
DATA * modify( DATA * head )
{ 
	int m,i,j,t,n;
	n=1;
	while(n==1)/*大循环*/
	{
		p1=p2=head;	
		if(head==NULL)/**没有数据**/
		{
			printf("没有任何号码可被修改,按任意键返回!\n");
            getch();
			return(head);
		}
		/**输入你想修改的彩票号码的期号**/
		printf("请输入你想修改的彩票号码的期号:\n");
		scanf("%d",&m);
		while(m<=0)
		{
			printf("彩票号码的期号应大于0!按任意键重新输入:\n");
			getch();
			scanf("%d",&m);
		}
		/**在原链表中查找该期期号**/
		while(m!=p1->name)
		{  
			if(p1->next==NULL)
			{
				printf("没找到所输入的彩票号码的期号,按任意键返回主菜单\n");
				getch();
                return(head);
			}
			else
			{
				p2=p1;
				p1=p1->next;
			}
     
		} 
		/**在原链表中查找到该期期号则执行以下程序**/
		printf("以下是你想修改的彩票号码的期号及号码:\n");
		printf("期号:  %2d\n",p1->name);
		printf("号码:  ");
		for(i=0;i<=7;i++)
			printf("%5d",p1->number[i]);
		printf("\n修改请按'1',按'0'键返回\n");
		scanf("%d",&n);
		/**想修改**/
		if(n==1)
		{
			printf("以下是该期彩票号码的期号: \n ");
			printf("%ld",p1->name);
			printf("\n输入新号码,以空格相隔:\n");
			for(i=0;i<=7;i++)
				scanf("%d",&p1->number[i]);
		}
		/**不想修改则返回**/
		else return(head);
 /*********以下对号码由小到大排序,气泡法******/
     
	    for(i=1;i<8;++i)
			for(j=7;j>=i;--j)
			{	if((p1->number[j-1])>(p1->number[j]))
				{
					t=p1->number[j-1];
			        p1->number[j-1]=p1->number[j];
                     p1->number[j]=t;
				}
			}/**排序结束**/
		printf("继续修改请按'1',按'0'键返回主菜单\n");
		scanf("%d",&n);
	}/*结束大循环*/
	return(head);
}
/**********************************************************************/
/*****查找函数*******************************************************/
/**********************************************************************/
void search(DATA * head)
{	int i,n;
	long int m;
	n=1; 
	while(n==1)/*大循环*/
	{	 
		p1=p2=head;	
		if(head==NULL)
		{
			printf("没有任何号码可被查找,按任意键返回!\n");
			getch();
			return;
		}
		printf("请输入你想查找的彩票号码的期号:\n");
		scanf("%ld",&m);
		if(m<=0)
		{
			printf("彩票号码的期号应大于0:\n");
			getch();
			return;
		}
		/**在原链表中查找该期期号**/
		while(m!=p1->name)
		{ 
			if(p1->next==NULL)
			{
				printf("没找到所输入的彩票号码的期号, 按任意键返回主菜单\n");
				getch();
		        return;
			}
			else
			{
				p2=p1;
				p1=p1->next;
			}
		} 
		printf("以下是你想查找的彩票号码的期号及号码:\n");
		printf("期号:%d\n",p1->name);
		printf("号码:  ");
		for(i=0;i<=7;i++)
			printf("%3d",p1->number[i]);
		printf("\n继续查找请按'1',按'0'键返回\n");
		scanf("%d",&n);
	}/*结束大循环*/
	return;
}
/*************************/
/*****结束文件***********/
/************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -