建议楼主把功能从main函数里独立出去,比如加法,减法,合并分别做独立的函数。楼主这样写在main函数里,会导致代码的可读性大大降低。
先调整一下代码吧,这样也便于查找问题~
#include
#include
#include
typedefintelem_type;
typedefstructpoly_key{
elem_typeratio;
elem_typepower;
}poly_obj,*poly_handle;
typedefstructpoly_node{
poly_objpoly;
structpoly_node*next;
}polynomial_obj,*polynomial_handle;
typedefint(*pfunc)(poly_obj,poly_obj);
staticpolynomial_handlecreate_node(void)
{
polynomial_handlepnew;
pnew=(polynomial_handle)malloc(sizeof(polynomial_obj));
if(!pnew){
fprintf(stderr,"mallocerror!\n");
returnNULL;
}
pnew->poly.ratio=0;
pnew->poly.power=0;
pnew->next=NULL;
returnpnew;
}
/*Createapolynomial*/
voidcreate_polynomial_link(polynomial_handle*phead)
{
polynomial_handlep,q;
while(1){
p=create_node();
printf("Pleaseinputtwonumbers(ratioandpower):");
scanf("%d%d",&p->poly.ratio,&p->poly.power);
if(p->poly.ratio==0)/*ifratioisequalzero,thenbreakfromwhile.*/
break;
if(!(*phead)){
*phead=p;
q=*phead;
continue;
}
q->next=p;
q=p;
}
free(p);
}
voidshow_polynomial_link(polynomial_handlephead)
{
polynomial_handlepcur;
pcur=phead;
while(pcur){
printf("%dx^%d",pcur->poly.ratio,pcur->poly.power);
pcur=pcur->next;
}
putchar(10);
}
intget_length_polynomial(polynomial_handlephead)
{
intcnt=0;
polynomial_handlepcur=phead;
while(pcur){
cnt++;
pcur=pcur->next;
}
returncnt;
}
/*flag:0:comparebyratio,1:comparebypower*/
staticintcheck_cond(polynomial_handlepnode,intval,intflag)
{
assert(pnode);
if(flag)
return(pnode->poly.power==val);
else
return(pnode->poly.ratio==val);
}
voiddelete_polynomail(polynomial_handle*phead,intval,intflag)
{
polynomial_handlepcur,prev;
pcur=prev=*phead;
while(pcur){
if(check_cond(pcur,val,flag)){
if(pcur==*phead){
*phead=(*phead)->next;
free(pcur);
pcur=*phead;
continue;
}
prev->next=pcur->next;
free(pcur);
pcur=prev->next;
}else{
prev=pcur;
pcur=pcur->next;
}
}
}
staticintcompare_as_ratio(poly_obja,poly_objb)
{
return(a.ratio-b.ratio);
}
staticintcompare_as_power(poly_obja,poly_objb)
{
return(a.power-b.power);
}
voidbubble_asc_sort(polynomial_handlephead,pfunccmp)
{
polynomial_handlep,q;
poly_objtmp;
for(p=phead;p;p=p->next)
for(q=phead;q->next;q=q->next)
if(cmp(q->poly,q->next->poly)>0){
tmp=q->poly;
q->poly=q->next->poly;
q->next->poly=tmp;
}
}
/*insertnodebeforephead*/
voidinsert_polynomail_node(polynomial_handle*phead,poly_objparam)
{
polynomial_handlepnew;
pnew=create_node();
pnew->poly=param;
pnew->next=*phead;
*phead=pnew;
}
voiddestroy_polynomail_link(polynomial_handlephead)
{
polynomial_handlepcur,prev;
pcur=phead;
while(pcur){
prev=pcur->next;
free(pcur);
pcur=prev;
}
}
intmain(void)
{
intlen,flag,val;
polynomial_handlephead=NULL;
poly_objpoly;
create_polynomial_link(&phead);
show_polynomial_link(phead);
printf("Addoneterm(ratio,power):");
scanf("%d%d",&poly.ratio,&poly.power);
insert_polynomail_node(&phead,poly);
printf("Afterinsert:\n");
show_polynomial_link(phead);
len=get_length_polynomial(phead);
printf("Thetermofpolynomialis%d\n",len);
bubble_asc_sort(phead,compare_as_ratio);
printf("Aftersortasratio:\n");
show_polynomial_link(phead);
bubble_asc_sort(phead,compare_as_power);
printf("Aftersortaspower:\n");
show_polynomial_link(phead);
printf("Delterms,delratioorpower(0,1):");
scanf("%d",&flag);
printf("Pleaseinputanumber:");
scanf("%d",&val);
delete_polynomail(&phead,val,flag);
printf("Afterdelete:\n");
show_polynomial_link(phead);
destroy_polynomail_link(phead);
return0;
}
个人写的多项式,供参考~ |