现有一个二进制文件 E82_data.bin,其中存储了若干整数, 请将文件保存至 C 盘根目录下的 cdata 文件夹。 编写程序完
成如下功能:
(1) 编写一个函数, 读取出这些整数。
(2) 编写一个函数,对所有整数按照从小到大排序。
(3) 编写一个函数,将所有整数输出到 C 盘根目录下的 cdata 文件夹中的文本文件中 E82_result.txt,要求所有整数输出在同一行,每个整数占 8 列。
(4) 编写一个函数,从第一个整数开始计数,当计数到 k 时,删除第 k 个整数,然后从第 k+1 个整数开始从新计数,当再次计数到 k 时,删除第 k 个整数,当计数到最后一个整数时,再次回到第一个整数开始计数,依次类推,直到只有一个整数为止。在测试程序中输出该整数。 k 由参数传入。
(5) 编写测试程序
/*============================================================================
*学号:1527403059
*作业:E82
*功能:(1) 编写一个函数,读取出这些整数。
(2) 编写一个函数,对所有整数按照从小到大排序。
(3) 编写一个函数,将所有整数输出到 C 盘根目录下的 cdata 文件夹中的文
本文件中 E82_result.txt,要求所有整数输出在同一行,每个整数占 8 列。
(4) 编写一个函数,从第一个整数开始计数,当计数到 k 时,删除第 k 个整
数,然后从第 k+1 个整数开始从新计数,当再次计数到 k 时,删除第 k 个整
数,当计数到最后一个整数时,再次回到第一个整数开始计数,依次类推,
直到只有一个整数为止。在测试程序中输出该整数。k 由参数传入。
(5) 编写测试程序。
*作者:陆胤任
*日期:2016.1.3
*=============================================================================*/
#include<stdio.h>
#include<stdlib.h>
struct Number //结构体
{
int num;
};
struct NumberNode //链表
{
int num;
struct NumberNode *next;
};
/*function define
*@brief:读取出这些整数
*@param:char *Filename:文件名
*@reval:*head:链表头节点
*/
struct NumberNode *ReadNumberNodeFormList(char *Filename)
{
struct NumberNode *head,*p,*q;
int res,t,i=0;
FILE *fp;
fp=fopen(Filename,"rb");
if(NULL==fp) //检查是否文件打开失败
{
printf("打开文件失败!\n");
exit(0);
}
head=(struct NumberNode*)malloc(sizeof(struct NumberNode)); //开辟新空间
q=head;
while(!feof(fp)) //如果未遇到文件结束标志
{
res=fread(&t,sizeof(int),1,fp);
if(res==0)
{
continue;
}
p=(struct NumberNode*)malloc(sizeof(struct NumberNode));
p->num=t;
q->next=p;
q=p;
}
p->next=NULL;
fclose(fp); //关闭文件
return head;
}
/*function define
*@brief:对所有整数按照从小到大排序。
*@param:struct NumberNode *head:头节点
*@reval:void
*/
void Sort_NumberNode(struct NumberNode *head)
{
struct NumberNode *pi,*pj,*pmin;
struct Number temp;
pi=head->next;
while(pi->next!=NULL) //选择排序
{
pmin=pi;
pj=pi->next;
while(pj!=NULL)
{
if(pmin->num>pj->num)
{
pmin=pj;
}
pj=pj->next;
}
if(pmin!=pi)
{
temp.num=pmin->num;
pmin->num=pi->num;
pi->num=temp.num;
}
pi=pi->next;
}
}
/*function define
*@brief:将文件内容显示到屏幕上
*@param:struct NumberNode *head:头节点
*@reval:void
*/
void Display_NumberNode(struct NumberNode *head)
{
struct NumberNode *p;
int c=0;
p=head->next;
while(p!=NULL)
{
printf("%8d",p->num);
c++;
if(c%3==0) //每3个数换一行
{
printf("\n");
}
p=p->next;
}
printf("\n");
}
/*function define
*@brief:将所有整数输出到 C 盘根目录下的 cdata 文件夹中的文本文件中 E82_result.txt,要求所有整数输出在同一行,每个整数占 8 列
*@param:char *Filename:文件名
struct NumberNode *head:链表头节点
*@reval:void
*/
void Write_NumberNode(char *Filename,struct NumberNode *head)
{
struct NumberNode *p;
FILE *fp;
fp=fopen(Filename,"w");
if(NULL==fp) //检查是否打开文件失败
{
printf("打开文件失败!\n");
}
p=head->next;
while(p!=NULL)
{
fprintf(fp,"%8d",p->num); //将文杰内容写入文本文档
p=p->next;
}
fprintf(fp,"\n");
fclose(fp); //关闭文件
}
/*function define
*@brief:删除节点
*@param:struct NumberNode *head:链表头节点
int k:有参数传入,计数
*@reval:int t:删除后所剩的整数
*/
int Delete_NumberNode(struct NumberNode *head,int k)
{
struct NumberNode *p,*q;
int i,t,count=1;
q=head;
p=q->next;
do
{
if(p==NULL)
{
q=head;
p=q->next;
continue; //跳出当前循环
}
if(count%k==0&&count!=0)
{
count=1;
q->next=p->next;
free(p);
p=q->next;
}
else
{
count++;
q=p;
p=p->next;
}
}while(!(q==head&&p->next==NULL));
t=p->num;
return t;
}
/*function define
*@brief:释放链表
*@param:struct NumberNode *head:链表头节点
*@reval:void
*/
void Free_NumberNode(struct NumberNode *head)
{
struct NumberNode *p,*q;
p=head;
while(p!=NULL) //循环释放
{
q=p;
p=p->next;
free(q);
}
}
int main() //主函数
{
struct NumberNode *head;
int k,t;
head=ReadNumberNodeFormList("C:\\cdata\\E82_data.bin");
Sort_NumberNode(head);
printf("排序后的整数如下:\n");
Display_NumberNode(head);
Write_NumberNode("C:\\cdata\\E82_result.txt",head);
printf("请输入一个数,确保该整数不大于程序显示的整数的个数:\n");
scanf("%d",&k);
t=Delete_NumberNode(head,k);
printf("最后得到的数为:\n");
printf("%d\n",t);
Free_NumberNode(head); //释放链表
return 0;
}