李忠老师《C语言非常道》练习6.20第3题结合输入输出、文件读写和链表排序解题参考

#include <stdio.h>
#include <stdlib.h>
typedef struct insrt
{
    int inum;
    struct insrt *next;
} inst,* pinst;

const char * saveinst(const char *filename)
{
    FILE *pf1=fopen(filename,"wb");
    pinst cur=malloc(sizeof (inst)),phead=cur;
    cur->next=malloc(sizeof (inst));
    cur->next->next=NULL;
    //char inctrl;
    while(scanf("%d",&cur->next->inum)==1)  //&&inctrl!='\n'
    {
        cur->next->next=malloc(sizeof(inst));
        cur=cur->next;
        cur->next->next=NULL;
        if(getchar()=='\n')break;
    }
    free(cur->next);
    cur->next=NULL;
    cur=phead->next;
    while(cur!=NULL)
    {
        fwrite(&cur->inum,sizeof(int),1,pf1);
        cur=cur->next;
    }
    fclose(pf1);
    return filename;
}
pinst readinst(const char *filename,pinst phead)
{
    FILE * pf2=fopen(filename,"rb");
    pinst cur=malloc(sizeof(inst));
    phead=cur;
    cur->next=malloc(sizeof(inst));
    cur->next->next=NULL;
    while(fread(&cur->next->inum,sizeof(int),1,pf2)==1)
    {
        cur->next->next=malloc(sizeof(inst));
        cur=cur->next;
        cur->next->next=NULL;
    }
    free(cur->next);
    cur->next=NULL;
    fclose(pf2);
    return phead->next;

}

pinst insrtput()
{

    inst inst2;
    pinst pist2=&inst2,pist3;
    do
    {
        pist2->next=(pinst)malloc(sizeof (inst));
        pist2->next->next=NULL;
        pist3=pist2;
        pist2=pist2->next;
    }
    while(fscanf(stdin,"%d",&pist2->inum)==1);  //&&(pist2->inum!=0)
    free(pist2);
    pist3->next=NULL;
    pist2=inst2.next;
    //free((void*)&inst2);
    return pist2;
}

pinst merge(pinst lhead,pinst rhead)
{
    if(lhead==NULL) return rhead;
    if(rhead==NULL) return lhead;
    pinst left=lhead,right=rhead,phead;
    if(lhead->inum<=rhead->inum)
    {
        phead=lhead;
        left=left->next;
    }
    else
    {
        phead=rhead;
        right=right->next;
    }
    pinst p=phead;
    while(left!=NULL&&right!=NULL)
    {
        if(left->inum<=right->inum)
        {
            p->next=left;
            left=left->next;
            p=p->next;
        }
        else
        {
            p->next=right;
            right=right->next;
            p=p->next;
        }
    }
    if(left==NULL)p->next=right;
    if(right==NULL)p->next=left;
    return phead;
}


pinst sortlist(pinst phead)  //链表归并排序
{
    if(phead==NULL||phead->next==NULL) return phead;
    pinst left=phead,right=phead;
    while((right->next!=NULL)&&(right->next->next!=NULL))
    {
        left=left->next;
        right=right->next->next;
    };
    pinst lhead=sortlist(left->next);
    left->next=NULL;
    pinst rhead=sortlist(phead);
    return merge(lhead,rhead);
}
pinst checknum(pinst head,int n)
{
    pinst pleft=malloc(sizeof(inst));
    pleft->next=head;
    pinst pre=pleft,cur=head;
    while(cur!=NULL)
    {
        if((cur->inum%n==0))
        {
            //int x=cur->inum%n;
            //int y=(cur->inum%n==0);
            pre->next=cur->next;
            free(cur);
            cur=pre->next;
        }
        else
        {
            cur=cur->next;
            pre=pre->next;
        }

    }
    head=pleft->next;
    free(pleft);
    return head;
}

void printlist(pinst phead)
{
    printf("the list you want print is:\n");
    while(phead!=NULL)
    {
        printf("%-8d",phead->inum);
        phead=phead->next;
    }
    printf("\n");
}


int main()
{
    pinst pist2;
    pist2=readinst(saveinst("delnum,dat"),pist2);
    printlist(pist2=sortlist(pist2));
    printlist(checknum(pist2,2));

    pinst pist1=insrtput();
    printlist(pist1=sortlist(pist1)); //printlist(sortlist(pist1));
    int n;
    printf("delete %%num:");
    scanf("%*s%d",&n);
    printf("\n");
    printlist(checknum(pist1,n));

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HsiaoShawn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值