#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;
}
李忠老师《C语言非常道》练习6.20第3题结合输入输出、文件读写和链表排序解题参考
于 2023-07-24 23:43:36 首次发布