C语言数据结构 一元多项式

请求大佬花点点时间,帮我查查到底哪儿出错了,非常感谢!

#include
#include

struct Node {
double coef;
int expn;
Node *next;
};

void CreatPolynomial(Node *&head, int n) // 生成带表头结点的单链表,除头结点外另生成n个结点

{
int i;
head = (Node *)malloc(sizeof(Node));
head->coef = 0;
head->expn = 0;
head->next = NULL; // 初始化头结点

printf("请输入各项系数和指数:\n");
Node *p = head;
for (int i = 0; i < n; i++) {
p->next = (Node *)malloc(sizeof(Node)); // 生成新结点,尾插入生成链表

p = p->next;
scanf("%lf %d",&p->coef,&p->expn);
p->next = NULL;
}
}

void PrintPolynomial(Node *&head)
{
if (head->next == NULL) // 结果是0时直接输出0

putchar('0');
else {
for (Node *p = head->next; p != NULL; p = p->next) {
if (p != head->next && p->coef >0) // 当p非首项且指向的系数为正时才输出'+'

putchar('+'); // 之前只判定了p->coef >0

        if (p->coef == 1) {                       //  系数为1或-1时特殊处理  
            if (p->expn == 0)
                putchar('1');                   //  判断条件不能写在一起:  
        }                                       //  if(p->coef == 1 && p->expn == 0) putchar('1');  
        else if (p->coef == -1)
            putchar('-');
        else
            printf("%lf\n", p->coef);

        switch (p->expn) {                        //  指数为0或1时特殊处理  

        case 0:
            break;

        case 1:
            putchar('x');
            break;

        default:
            p->expn < 0 ? printf("x^(%d)", p->expn) : printf("x^%d", p->expn);  //  指数小于0时打括号  
            break;
        }
    }
}
printf("\n");

}

void Free(Node *&head)
{
Node *q = NULL;
for (Node *p = head; p != NULL; p = q) {
q = p->next;
free(p);
}
}

char cmp(int a, int b)
{
if (a > b)
return '>';
if (a < b)
return '<';
return '=';
}

void AddPolynomial(Node *&pA, Node *&pB) // 传进两个链表的头指针

{
Node *ha = pA;
Node *hb = pB;
Node *qa = ha->next; // ha, hb分别跟在qa, qb的后一位置

Node *qb = hb->next; // qa, qb分别指向Pa, Pb中当前比较元素

while (qa && qb)
{
double sum = 0;
int a = qa->expn;
int b = qb->expn;
switch (cmp(a, b)) {

    case '<':
        ha = qa;
        qa = qa->next;                       //  非ha = ha->next;  
        break;

    case '=':
        sum = qa->coef + qb->coef;
        if (sum != 0.0) {
            qa->coef = sum;
            ha = qa;
        }
        else {
            if (ha->next != qa)
            printf("Error: ha->next != qa  \n");
            ha->next = ha->next->next;     //  删除和为0的结点,ha不变,还在qa后一位置  
            free(qa);
        }
        if (hb->next != qb)
        printf("Error: hb->next != qb  \n");
        hb->next = hb->next->next;
        free(qb);
        qb = hb->next;
        qa = ha->next;
        break;

    case '>':
        hb->next = hb->next->next;         //  删除qb指向的结点  
        qb->next = ha->next;              //  将qb插入ha后qa前  
        ha->next = qb;

        qb = hb->next;                       //  not qb = ha->next  
        ha = ha->next;
        break;

    default:
        printf("Error!  \n");
        break;
    }
}
if (qb)
    ha->next = qb;
free(hb);

}

int main(void)
{

Node *A = NULL;
Node *B = NULL;
int lenA;
int lenB;
do
{
printf("请输入A的项数:\n");
scanf(" %d", &lenA);
CreatPolynomial(A, lenA); // 生成A链表

    printf("请输入B的项数:\n");//  生成B链表  
    scanf("%d\n",&lenB);
    CreatPolynomial(B, lenB);

    printf(" A= ");    //  输出A链表  
    PrintPolynomial(A);
    printf(" B= ");//  输出B链表
    PrintPolynomial(B);

    AddPolynomial(A, B);                        //  A = A + B  
    printf(" A+B=  ");
    PrintPolynomial(A);                         //  输出和  
    printf("\n");

    Free(A);  //  释放结点  

} while (true);
return 0;
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问