1. 编写一个函数,读取二进制文件中的所有整数,并构建一个整数链表。
2. 编写一个函数,在屏幕上显示第1步中生成的整数链表的所有整数,要求每行输出6个,每个占9列,右对齐。
3. 编写一个函数,对第1步生成链表中的每个结点内的整数作逆序处理。在main函数中输出结点数据逆序处理后的整数链表,输出格式与第2步相同。
4. 编写一个函数,找出第3步中生成的整数链表中最大值、最小值和平均值。在main函数中输出最大值、最小值和平均值。5. 编写一个函数,删除第3步生成的整数链表中结点整数含有数字3的所有结点。在main函数中输出删除结点后的整数链表,输出格式与第2步相同。
6. 编写一个函数,将第5步生成的整数链表中结点整数同时含有数字4和8的所有结点的整数值输出到D盘根目录下的文本文件result.txt中,要求每个整数占一行。
typedef struct _node
{int value;
struct _node *pnext;
}TagNode;
TagNode* append_list(TagNode* phead,TagNode* temp)
{
if(phead==NULL){
phead=temp;
}
else{
TagNode* p=phead;
while(p->pnext) p=p->pnext;
p->pnext=temp;
}
return phead;
}
TagNode * create_list(char* filename)
{
FILE* fp=fopen(filename,"rb");
TagNode * phead=NULL;
TagNode* temp;
int value;
if(fp==NULL) printf("file error!\n");
while(fread(&value,sizeof(int),1,fp)==1){
temp=(TagNode*)malloc(sizeof(TagNode));
temp->value=value;
temp->pnext=NULL;
phead=append_list(phead,temp);
}
fclose(fp);
return phead;
}
void reverse_list(TagNode *phead)
{
TagNode* p=phead;
int value;
int temp;
int num;
if(phead==NULL) printf("no record!\n");
else{
while(p){
temp=p->value;
value=0;
while(temp){
num=temp%10;
value=value*10+num;
temp=temp/10;
}
p->value=value;
p=p->pnext;
}
}
}
void search_nums_of_list(TagNode* phead,int* max,int* min,double* avg)
{
TagNode* p=phead;
int sum;
int count;
if(phead==NULL){
printf("No record!\n");
return;
}
*max=*min=sum=p->value;
count=1;
p=p->pnext;
while(p){
if(p->value>*max) *max=p->value;
if(p->value<*min) *min=p->value;
sum+=p->value;
count++;
p=p->pnext;
}
*avg=(double)sum/count;
}
void delete_node_of_list(TagNode* phead)
{
TagNode* p=phead,*q=phead;
int temp;
if(phead==NULL){
printf("no record!\n");
return;
}
while(p){
temp=p->value;
while(temp){
if(temp%10==3) break;
else temp=temp/10;
}
if(temp>0){ //此时p指向要删除的结点
if(p==phead){
phead=p->pnext;
free(p);
p=phead;
q=phead;
}
else{
q->pnext=p->pnext;
free(p);
p=q->pnext;
}
}
else{
q=p;
p=p->pnext;
}
}
}
int judge(int value)
{
int flag1=0,flag2=0;
while(value){
if(value%10==4) flag1=1;
if(value%10==8) flag2=1;
value=value/10;
}
if(flag1 && flag2) return 1;
else return 0;
}
void out_list(char* filename,TagNode* phead)
{
FILE* fp=fopen(filename,"w");
TagNode* p=phead;
if(fp==NULL){
printf("file error!\n");
return;
}
if(phead==NULL){
printf("no record!\n");
return;
}
while(p){
if(judge(p->value)){ //同时含有数字4,8
fprintf(fp,"%d\n",p->value);
}
p=p->pnext;
}
fclose(fp);
}
void display_list(TagNode* phead)
{
TagNode* p=phead;
int count=0;
if(phead==NULL) printf("no record!\n");
while(p){
printf("%9d",p->value);
count++;
if(count%6==0) printf("\n");
p=p->pnext;
}
printf("\n");
}
void free_list(TagNode* phead)
{
TagNode* p=phead;
if(phead==NULL) return;
while(p){
p=p->pnext;
free(phead);
phead=p;
}
}
int main()
{
TagNode *phead; // 指向链表的头结点
int max, min; // 分别存放链表中结点的最大值和最小值
double avg; // 存放链表中结点的平均值
//===创建链表并显示链表=======
puts("原始链表为:");
phead = create_list("D:\\data.dat"); // 创建链表
display_list(phead); // 显示链表
//===链表中结点内的整数逆序后的链表=====
puts("结点内的整数逆序后的链表为:");
reverse_list(phead); // 逆序链表
display_list(phead); // 显示链表
//===找出最大值、最小值、平均值====
search_nums_of_list(phead,&max,&min,&avg); // 找出最大值、最小值和平均值
puts("链表的最大值、最小值和平均值为:");
printf("最大值为: %10d\n", max);
printf("最小值为: %10d\n", min);
printf("平均值为: %10.2f\n", avg);
//===删除链表中包含数字3的结点===
puts("删除结点后的链表为:");
delete_node_of_list(phead); // 删除包含数字3的结点
display_list(phead);
//===输出链表到文件中====
out_list("D:\\result.txt",phead); // 输出链表中包含数字4和8的结点的整数到文件
//====释放链表======
free_list(phead);
return 0;
}