📄 fun.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 + -