「已注销」 2021-06-28 08:53 采纳率: 100%
浏览 26
已采纳

请教,菜单问题,只能完整运行case 1,其他就是空白

出问题代码

int menu_create()
{int a;
 printf(" 输入 1 查看两多项式相加结果 \n 输入 2 查看两多项式相减结果 \n 输入 3 查看两多项式相乘结果 \n");
 scanf("%d",&a);
 if(a!=1&&a!=2&&a!=3)printf(" 输入有误 ");
 return a;
}
int main()
{ PolyNode *h1,*h2,*h;
 h1=Creatpoly();
 printf(" 该多项式为 P1(x)=");
 UnitePoly(h1);
 Insortup(h1);
 Prin_poly(h1);
 printf("\n");
 h2=Creatpoly();
 printf(" 该多项式为 P2(x)=");
 UnitePoly(h2);
 Insortup(h2);
 Prin_poly(h2);
 printf("\n");
 for(;;)
 {switch(menu_create())
 {
	case 1:printf(" 相加后的多项式 \n");
           {
		   h=addition(h1,h2);
           UnitePoly(h);
           printf(" 按 X 的升幂排列 ");
           Insortup(h);
           Prin_poly(h);
           printf("\n");
           printf(" 按 X 的降幂排列 ");
           Insortdown(h);
           Prin_poly(h);
           printf("\n");}
           break;
    case 2:printf(" 相减后的多项式 \n");
    {
           h=subduction(h1,h2);
           UnitePoly(h);
           printf(" 按 X 的升幂排列 ");
           Insortup(h);
           Prin_poly(h);
           printf("\n");
           printf(" 按 X 的降幂排列 ");
           Insortdown(h);
           Prin_poly(h);
           printf("\n");}
		   break;
	case 3:printf(" 相乘后的多项式为 \n");
	{
           h=polymuti(h1,h2);
           UnitePoly(h);
           printf(" 按 X 的升幂排列 ");
           Insortup(h);
           Prin_poly(h);
           printf("\n");
           printf(" 按 X 的降幂排列 ");
           Insortdown(h);
           Prin_poly(h);
           printf("\n");}
		   break;	        
 }
 }
return 0;
}

运行出来就是这样

出不来case2和case3的结果

源代码

#include<stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Node
{
 int coef;// 系数
 int exp;// 指数
 struct Node *next;
}PolyNode;
PolyNode *Creatpoly()// 创建多项式的单链表
{
 PolyNode *h,*p,*q;
 h=(PolyNode *)malloc(sizeof(PolyNode));
 p=h;
 p->next=NULL;
 printf(" 请输入多项式的系数及其指数 a b ,当系数输入 0 时停止输入 \n");
 q=(PolyNode *)malloc(sizeof(PolyNode));
 scanf("%d %d",&q->coef,&q->exp);
 while(q->coef!=0)
 {
   p->next=q;
   p=q;
   q=(PolyNode *)malloc(sizeof(PolyNode));
   scanf("%d %d",&q->coef,&q->exp);
 }
 p->next=NULL;
 return(h);
}
void Prin_poly(PolyNode *h)// 将多项式输出函数
{
 PolyNode *p;
 p=h->next;
 while(p!=NULL)
 {  
   if(p->coef>0&&p!=h->next)
   {
     if(p->exp>0)
       printf("+%dx^%d",p->coef,p->exp);
     else if(p->exp<0)
       printf("+%dx^(%d)",p->coef,p->exp);
     else
       printf("+%d",p->coef);
   }
   else if(p->coef<0&&p!=h->next)
   {
     if(p->exp>0)
       printf("%dx^%d",p->coef,p->exp);
     else if(p->exp<0)
       printf("%dx^(%d)",p->coef,p->exp);
     else
       printf("%d",p->coef);
   }
   else 
   {
     if(p->exp>0)
       printf("%dx^%d",p->coef,p->exp);
     else if(p->exp<0)
       printf("%dx^(%d)",p->coef,p->exp);
     else printf("%d",p->coef);
   }
   p=p->next;
 }
}
void Insortup(PolyNode *h)// 排序函数,使多项式中的各项按 X 的升幂排列
{
 PolyNode *s,*p;
 int t,m;
 for(p=h->next;p!=NULL;p=p->next)// 类似于冒泡排序
 {  
   for(s=h->next;s->next!=NULL;s=s->next)
   {
     if(s->exp>s->next->exp)
     {
       t=s->exp;
       m=s->coef;
       s->coef=s->next->coef;
       s->exp=s->next->exp;
       s->next->coef=m;
       s->next->exp=t;
     }
   }
 }
}
void Insortdown(PolyNode *h)// 排序函数,使多项式中的各项按 X 的降幂排列
{
 PolyNode *s,*p;
 int t,m;
 for(p=h->next;p!=NULL;p=p->next)// 类似于冒泡排序
 {  
   for(s=h->next;s->next!=NULL;s=s->next)
   {
     if(s->exp<s->next->exp)
     {
       t=s->exp;
       m=s->coef;
       s->coef=s->next->coef;
       s->exp=s->next->exp;
       s->next->coef=m;
       s->next->exp=t;
     }
   }
 }
}
void UnitePoly(PolyNode *h)// 合并同类项
{
 PolyNode *p1,*p2,*q1,*q2,*temp;
 q1=h;
 p1=q1->next;
 while(p1!=NULL)
 {
   p2=p1->next;
   q2=p1;
   while(p2!=NULL)
   {
     if(p1->exp==p2->exp)
     {
       p1->coef=p1->coef+p2->coef;
       if(p1->coef==0)
       {
         temp=p2;
         q2->next=p2->next;
         free(temp);
         temp=p1;
         q1->next=p1->next;
         p1=q1;
         free(temp);
         break;
       }
       else
       {
         temp=p2;
         q2->next=p2->next;
         p2=p2->next;
         free(temp);
       }
     }
     else
     {
       q2=p2;
       p2=p2->next;
     }
   }
   q1=p1;
   p1=p1->next;
 }
}
PolyNode *polymuti(PolyNode *h1,PolyNode *h2)// 多项式相乘
{
 PolyNode *h,*p,*p1,*p2,*q;
 p1=h1->next;
 h=p=(PolyNode *)malloc(sizeof(PolyNode));
 p->next=NULL;
 while(p1)
 {
   p2=h2->next;
   while(p2)
   {
     q=(PolyNode *)malloc(sizeof(PolyNode));
     q->coef=p1->coef*p2->coef;
     q->exp=p1->exp+p2->exp;
     p->next=q;
     p=q;
     p2=p2->next;
   }
   p1=p1->next;
 }
 p->next=NULL;
 return(h);
}
PolyNode *addition(PolyNode *ha, PolyNode *hb)// 一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式 ha 中,并将多项式 hb 删除
 { 
 PolyNode *p,*q,*pre,*temp; 
int sum; 
p=ha->next; 
q=hb->next; 
pre=ha;
 while(p!=NULL&&q!=NULL) {
 if(p->exp<q->exp) {
 pre->next=p;
 pre=pre->next;
 p=p->next;
 } 
else if(p->exp==q->exp)
 {
 sum=p->coef+q->coef;
 if(sum!=0) {
 p->coef=sum; 
pre->next=p;
pre=pre->next;
p=p->next;
 temp=q;q=q->next;free(temp); 
}
 else // 如果系数和为零,则删除结点 p 与 q ,并将指针指向下一个结点
 {
 temp=p->next;
free(p);
p=temp;
 temp=q->next;
free(q);
q=temp;
 } }
 else {
 pre->next=q;
 pre=pre->next;
 q=q->next;
 } }
 if(p!=NULL) // 将多项式 A 中剩余的结点加入到和多项式中
 pre->next=p;
 else pre->next=q; 
 return ha;
}
PolyNode *subduction(PolyNode *ha, PolyNode *hb)// 一元多项式相减函数,用于将两个多项式相减,然后将差多项式存放在多项式 ha 中,并将多项式 hb 删除
 { 
 PolyNode *p,*q,*pre,*temp; 
int sum; 
p=ha->next; 
q=hb->next; 
pre=ha;
 while(p!=NULL&&q!=NULL) {
 if(p->exp<q->exp) {
 pre->next=p;
 pre=pre->next;
 p=p->next;
 } 
else if(p->exp==q->exp)
 {
 sum=p->coef-q->coef;
 if(sum!=0) {
 p->coef=sum; 
pre->next=p;
pre=pre->next;
p=p->next;
 temp=q;q=q->next;free(temp); 
}
 else // 如果系数和为零,则删除结点 p 与 q ,并将指针指向下一个结点
 {
 temp=p->next;
free(p);
p=temp;
 temp=q->next;
free(q);
q=temp;
 } }
 else {
 pre->next=q;
 pre=pre->next;
 q=q->next;
 } }
 if(p!=NULL) // 将多项式 A 中剩余的结点加入到和多项式中
 pre->next=p;
 else pre->next=q; 
 return ha;
} 
int menu_create()
{int a;
 printf(" 输入 1 查看两多项式相加结果 \n 输入 2 查看两多项式相减结果 \n 输入 3 查看两多项式相乘结果 \n");
 scanf("%d",&a);
 if(a!=1&&a!=2&&a!=3)printf(" 输入有误 ");
 return a;
}
int main()
{ PolyNode *h1,*h2,*h;
 h1=Creatpoly();
 printf(" 该多项式为 P1(x)=");
 UnitePoly(h1);
 Insortup(h1);
 Prin_poly(h1);
 printf("\n");
 h2=Creatpoly();
 printf(" 该多项式为 P2(x)=");
 UnitePoly(h2);
 Insortup(h2);
 Prin_poly(h2);
 printf("\n");
 for(;;)
 {switch(menu_create())
 {
	case 1:printf(" 相加后的多项式 \n");
           {
		   h=addition(h1,h2);
           UnitePoly(h);
           printf(" 按 X 的升幂排列 ");
           Insortup(h);
           Prin_poly(h);
           printf("\n");
           printf(" 按 X 的降幂排列 ");
           Insortdown(h);
           Prin_poly(h);
           printf("\n");}
           break;
    case 2:printf(" 相减后的多项式 \n");
    {
           h=subduction(h1,h2);
           UnitePoly(h);
           printf(" 按 X 的升幂排列 ");
           Insortup(h);
           Prin_poly(h);
           printf("\n");
           printf(" 按 X 的降幂排列 ");
           Insortdown(h);
           Prin_poly(h);
           printf("\n");}
		   break;
	case 3:printf(" 相乘后的多项式为 \n");
	{
           h=polymuti(h1,h2);
           UnitePoly(h);
           printf(" 按 X 的升幂排列 ");
           Insortup(h);
           Prin_poly(h);
           printf("\n");
           printf(" 按 X 的降幂排列 ");
           Insortdown(h);
           Prin_poly(h);
           printf("\n");}
		   break;	        
 }
 }
return 0;
}
  • 写回答

2条回答 默认 最新

  • 老衲要还俗娶婆娘 2021-06-28 09:48
    关注
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    typedef struct Node
    {
        int coef; // 系数
        int exp;  // 指数
        struct Node *next;
    } PolyNode;
    PolyNode *Creatpoly() // 创建多项式的单链表
    {
        PolyNode *h, *p, *q;
        h = (PolyNode *)malloc(sizeof(PolyNode));
        p = h;
        p->next = NULL;
        printf(" 请输入多项式的系数及其指数 a b ,当系数输入 0 时停止输入 \n");
        q = (PolyNode *)malloc(sizeof(PolyNode));
        scanf("%d %d", &q->coef, &q->exp);
        while (q->coef != 0)
        {
            p->next = q;
            p = q;
            q = (PolyNode *)malloc(sizeof(PolyNode));
            scanf("%d %d", &q->coef, &q->exp);
        }
        p->next = NULL;
        return (h);
    }
    void Prin_poly(PolyNode *h) // 将多项式输出函数
    {
        PolyNode *p;
        p = h->next;
        while (p != NULL)
        {
            if (p->coef > 0 && p != h->next)
            {
                if (p->exp > 0)
                    printf("+%dx^%d", p->coef, p->exp);
                else if (p->exp < 0)
                    printf("+%dx^(%d)", p->coef, p->exp);
                else
                    printf("+%d", p->coef);
            }
            else if (p->coef < 0 && p != h->next)
            {
                if (p->exp > 0)
                    printf("%dx^%d", p->coef, p->exp);
                else if (p->exp < 0)
                    printf("%dx^(%d)", p->coef, p->exp);
                else
                    printf("%d", p->coef);
            }
            else
            {
                if (p->exp > 0)
                    printf("%dx^%d", p->coef, p->exp);
                else if (p->exp < 0)
                    printf("%dx^(%d)", p->coef, p->exp);
                else
                    printf("%d", p->coef);
            }
            p = p->next;
        }
    }
    void Insortup(PolyNode *h) // 排序函数,使多项式中的各项按 X 的升幂排列
    {
        PolyNode *s, *p;
        int t, m;
        for (p = h->next; p != NULL; p = p->next) // 类似于冒泡排序
        {
            for (s = h->next; s->next != NULL; s = s->next)
            {
                if (s->exp > s->next->exp)
                {
                    t = s->exp;
                    m = s->coef;
                    s->coef = s->next->coef;
                    s->exp = s->next->exp;
                    s->next->coef = m;
                    s->next->exp = t;
                }
            }
        }
    }
    void Insortdown(PolyNode *h) // 排序函数,使多项式中的各项按 X 的降幂排列
    {
        PolyNode *s, *p;
        int t, m;
        for (p = h->next; p != NULL; p = p->next) // 类似于冒泡排序
        {
            for (s = h->next; s->next != NULL; s = s->next)
            {
                if (s->exp < s->next->exp)
                {
                    t = s->exp;
                    m = s->coef;
                    s->coef = s->next->coef;
                    s->exp = s->next->exp;
                    s->next->coef = m;
                    s->next->exp = t;
                }
            }
        }
    }
    void UnitePoly(PolyNode *h) // 合并同类项
    {
        PolyNode *p1, *p2, *q1, *q2, *temp;
        q1 = h;
        p1 = q1->next;
        while (p1 != NULL)
        {
            p2 = p1->next;
            q2 = p1;
            while (p2 != NULL)
            {
                if (p1->exp == p2->exp)
                {
                    p1->coef = p1->coef + p2->coef;
                    if (p1->coef == 0)
                    {
                        temp = p2;
                        q2->next = p2->next;
                        free(temp);
                        temp = p1;
                        q1->next = p1->next;
                        p1 = q1;
                        free(temp);
                        break;
                    }
                    else
                    {
                        temp = p2;
                        q2->next = p2->next;
                        p2 = p2->next;
                        free(temp);
                    }
                }
                else
                {
                    q2 = p2;
                    p2 = p2->next;
                }
            }
            q1 = p1;
            p1 = p1->next;
        }
    }
    PolyNode *polymuti(PolyNode *h1, PolyNode *h2) // 多项式相乘
    {
        PolyNode *h, *p, *p1, *p2, *q;
        p1 = h1->next;
        h = p = (PolyNode *)malloc(sizeof(PolyNode));
        p->next = NULL;
        while (p1)
        {
            p2 = h2->next;
            while (p2)
            {
                q = (PolyNode *)malloc(sizeof(PolyNode));
                q->coef = p1->coef * p2->coef;
                q->exp = p1->exp + p2->exp;
                p->next = q;
                p = q;
                p2 = p2->next;
            }
            p1 = p1->next;
        }
        p->next = NULL;
        return (h);
    }
    PolyNode *addition(PolyNode *ha, PolyNode *hb) // 一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式 ha 中,并将多项式 hb 删除
    {
        PolyNode *p, *q, *pre, *temp,*Head,*pH,*qH;
        Head = (PolyNode *)malloc(sizeof(PolyNode));
        pH = Head;
        
        int sum;
        p = ha->next;
        q = hb->next;
        pre = ha;
        while (p != NULL && q != NULL)
        {
            if (p->exp < q->exp)			
            {
                p = p->next;
                qH = (PolyNode *)malloc(sizeof(PolyNode));
                qH->coef = p->coef;
                qH->exp = p->exp;
                pH->next = qH;
                pH = qH;
            }
            else if (p->exp == q->exp)
            {
                sum = p->coef + q->coef;
                if (sum != 0)
                {
                	qH = (PolyNode *)malloc(sizeof(PolyNode));
                	qH->coef = sum;
                	qH->exp = p->exp;
    				pH->next = qH;
                	pH = qH; 
    				
                    p = p->next;
                    q = q->next;
                }
                else // 如果系数和为零,(则删除结点 p 与 q )不加入结果Head就行,并将指针指向下一个结点
                {
                   p = p->next;
                    q = q->next;
                }
            }
            else
            {
                q = q->next;
            }
        }
        if (p != NULL) // 将多项式 A 中剩余的结点加入到和多项式中
        	pH->next = p;
        else
            pH->next = q;
        return Head;
    }
    PolyNode *subduction(PolyNode *ha, PolyNode *hb) // 一元多项式相减函数,用于将两个多项式相减,然后将差多项式存放在多项式 ha 中,并将多项式 hb 删除
    {
        PolyNode *p, *q, *pre, *temp,*Head,*pH,*qH;
        Head = (PolyNode *)malloc(sizeof(PolyNode));
        pH = Head;
        
        int sum;
        p = ha->next;
        q = hb->next;
        pre = ha;
        while (p != NULL && q != NULL)
        {
            if (p->exp < q->exp)			
            {
                p = p->next;
                qH = (PolyNode *)malloc(sizeof(PolyNode));
                qH->coef = p->coef;
                qH->exp = p->exp;
                pH->next = qH;
                pH = qH;
            }
            else if (p->exp == q->exp)
            {
                sum = p->coef - q->coef;
                if (sum != 0)
                {
                	qH = (PolyNode *)malloc(sizeof(PolyNode));
                	qH->coef = sum;
                	qH->exp = p->exp;
    				pH->next = qH;
                	pH = qH; 
    				
                    p = p->next;
                    q = q->next;
                }
                else // 如果系数和为零,(则删除结点 p 与 q )不加入结果Head就行,并将指针指向下一个结点
                {
                   p = p->next;
                    q = q->next;
                }
            }
            else
            {
                q = q->next;
            }
        }
        if (p != NULL) // 将多项式 A 中剩余的结点加入到和多项式中
        	pH->next = p;
        else
            pH->next = q;
        return Head;
    }
    int menu_create()
    {
        int a;
        printf(" 输入 1 查看两多项式相加结果 \n 输入 2 查看两多项式相减结果 \n 输入 3 查看两多项式相乘结果 \n");
        scanf("%d", &a);
        if (a != 1 && a != 2 && a != 3)
            printf(" 输入有误 ");
        return a;
    }
    int main()
    {
        PolyNode *h1, *h2, *h;
        h1 = Creatpoly();
        printf(" 该多项式为 P1(x)=");
        UnitePoly(h1);
        Insortup(h1);
        Prin_poly(h1);
        printf("\n");
        h2 = Creatpoly();
        printf(" 该多项式为 P2(x)=");
        UnitePoly(h2);
        Insortup(h2);
        Prin_poly(h2);
        printf("\n");
        for (;;)
        {
            switch (menu_create())
            {
            case 1:
                printf(" 相加后的多项式 \n");
                {
                    h = addition(h1, h2);
                    UnitePoly(h);
                    printf(" 按 X 的升幂排列 ");
                    Insortup(h);
                    Prin_poly(h);
                    printf("\n");
                    printf(" 按 X 的降幂排列 ");
                    Insortdown(h);
                    Prin_poly(h);
                    printf("\n");
                   /*
                    //可加入你自己的程序验证,发现h1,h2都被改变了 
                    Prin_poly(h1);
                    printf("\n");
                    Prin_poly(h2);
                    printf("\n");
                    */
    
                }
                break;
            case 2:
                printf(" 相减后的多项式 \n");
                {
                    h = subduction(h1, h2);
                    UnitePoly(h);
                    printf(" 按 X 的升幂排列 ");
                    Insortup(h);
                    Prin_poly(h);
                    printf("\n");
                    printf(" 按 X 的降幂排列 ");
                    Insortdown(h);
                    Prin_poly(h);
                    printf("\n");
                    
    				/*
                    //可加入你自己的程序验证,发现h1,h2都被改变了 
                    Prin_poly(h1);
                    printf("\n");
                    Prin_poly(h2);
                    printf("\n");
                    */
                }
                break;
            case 3:
                printf(" 相乘后的多项式为 \n");
                {
                    h = polymuti(h1, h2);
                    UnitePoly(h);
                    printf(" 按 X 的升幂排列 ");
                    Insortup(h);
                    Prin_poly(h);
                    printf("\n");
                    printf(" 按 X 的降幂排列 ");
                    Insortdown(h);
                    Prin_poly(h);
                    printf("\n");
                    /*
                    //可加入你自己的程序验证,发现h1,h2都被改变了 
                    Prin_poly(h1);
                    printf("\n");
                    Prin_poly(h2);
                    printf("\n");
                    */
                }
                break;
            }
        }
        return 0;
    }

    程序的问题是,在进行加减运算时,链表h1,h2的内容被改变,如果一直运行乘法3,没有任何问题。但只要进行了加减运算,就会出现错误,你可以试一下,在进行加减运算后输出两个链表,发现改变了,进行乘法运算后,链表h1,h2不会发生改变。更明显的地方是,加减函数,你直接返回ha,将ha作为结果返回,这不就说明,你改变了链表h1的内容?所以这里需要另外一条链表,来作为返回结果。

    链表当时没学好,加减函数你自己可以再改一改

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料