链表习题3

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值