C使用链表实现加减乘究竟哪里错了

运行结果总是出现项缺失


#include<stdio.h>
#include<malloc.h>//修订思路:1、在原代码上修订。2、改用for循环取代while循环
typedef struct poly {
    int factor;//系数
    int exp;//幂指数
    int use;//备用标志
    struct poly *next;
}POLY;
void show_1(int *F1,int *F2,int n);
void create(POLY *F1,POLY *F2);
void show(POLY *F);
void clear(POLY *F);
int count(POLY *F);
//测试代码段:
void sum(POLY *F1, POLY *F2) {
    int a,b;
    a=count(F1);
    b=count(F2);
    POLY *P;
    POLY *S1=F1;
    POLY *S2=F2;

    int factor_1[100]={};
    int exp_1[100]={};
    int factor_2[100]={};
    int exp_2[100]={};
    int factor[100]={};
    int exp[100]={};
    int i1,i2=0;
    int i3,i4=0;
    int i=0;
    for(i1=0;i1<=a;i1++){
        factor_1[i1]=S1->factor;
        exp_1[i1]=S1->exp;
        S1=S1->next;
    }
    for(i2=0;i2<=b;i2++){
        factor_2[i2]=S2->factor;
        exp_2[i2]=S2->exp;
        S2=S2->next;
    }
    int n=0;
    for(i3=0;i3<a;i3++){
        n=0;
        for(i4=0;i4<b;i4++){
            if(exp_1[i3]==exp_2[i4]){
                factor_2[i4]=factor_2[i4]+factor_1[i3];
            }else{
                n=n+1;
            }
            if(n==(b-1)){
                exp_2[(i3+i4+1)]=exp_1[i3];//不确定要不要加 1 
                factor_2[(i3+i4+1)]=factor_1[i3];
            }
        }
    }
    
    show_1(factor_2,exp_2,(a+b+1));
}




//测试代码段: 
int main() {
    POLY p1 = {};
    POLY p2 = {};

    POLY *P1 = &p1;
    POLY *P2 = &p2;

    first:int n = 10;
    printf("\n***************数据结构综合性实验******************");
    printf("\n*******一、多项式的加法、减法、乘法运算**********");
    printf("\n*******        1.多项式创建            **********");
    printf("\n*******        2.多项式相加            **********");
    printf("\n*******        3.多项式相减            **********");
    printf("\n*******        4.多项式相乘            **********");
    printf("\n*******        5.清空多项式            **********");
    printf("\n*******         0.退出系统             **********");
    printf("\n*******        请选择(0—5)          **********");
    printf("\n*************************************************\n");
    printf("*请选择(0-5):\n");
    scanf("%d", &n);
    getchar();
    switch (n)
    {
    case 1:        create(P1, P2); goto first;
    case 2:        sum(P1, P2); goto first;
//    case 3: subduction(P1, P2); goto first;
//    case 4:        multiplication(P1, P2); goto first;
    case 5:        clear(P1); clear(P2); goto first;
    case 0:        goto last; 
    default:
        break;
    }


    last:return 0;
}

void create(POLY *F1, POLY *F2) {
    POLY *P;
    POLY *S = F1;
    int n = 0;
    int m = 0;
    int i1, i2 = 0;                            //循环变量
    printf("请输入第一个多项式项数\n");
    scanf("%d", &n);
    getchar();
    printf("请依次输入%d对系数和指数\n",n);
    for (i1 = 0; i1 < n; i1++) {
        scanf("%d", &S->factor);
        getchar();
        scanf("%d", &S->exp);
        getchar();
        if (i1 == (n - 1)) {
            S->next = NULL;
        }
        else {
            P = (POLY*)malloc(sizeof(POLY));
            S->next = P;
            S = P;
        }                                    //最后一项为NULL
    }

    S = F2;
    printf("请输入第二个多项式项数\n");
    scanf("%d", &m);
    getchar();
    printf("请依次输入%d对系数和指数\n",m);
    for (i2 = 0; i2 < m; i2++) {
        scanf("%d", &S->factor);
        getchar();
        scanf("%d", &S->exp);
        getchar();
        if (i2 == (m - 1)) {
            S->next = NULL;
        }
        else {
            P = (POLY*)malloc(sizeof(POLY));
            S->next = P;
            S = P;
        }                            //最后一项为NULL
    }
    show(F1);
    show(F2);
}
void clear(POLY *F) {
    POLY *S;
    POLY *P;
    POLY *Q;
    S = F;
    while (S != NULL)
    {
        P = S;
        S = S->next;
        free(P);
    }
}
void show(POLY *F) {
    POLY *S = F;
    printf("\n 方程式为 \n");
    int n=0;
    while (S != NULL) {
        if(n==0){
            printf("%d*x^%d", S->factor, S->exp);}
        if(S->factor>0&&n!=0){
            printf("+%d*x^%d", S->factor, S->exp);}
        if(S->factor<0){
            printf("-%d*x^%d", S->factor, S->exp);}
        S = S->next;
        n=n+1;
    }
    printf("\n");
}
int count(POLY *F) {
    POLY *S = F;
    int p=0;
    while (S->next!=NULL) {
        p = p + 1;
        S = S->next;
    }
    return p;
}
void show_1(int *F1,int *F2,int n){
    int P=*F1;
    int S=*F2;
    int i=0;
    printf("多项式为:");
    for(i=0;i<n;i++){
        if(i==0){
            printf("%d*x^%d",*(F1+i),*(F2+i));
        }
        else{
            printf(" + %d*x^%d",*(F1+i),*(F2+i));
        }
    }
    printf("\n");
}
#include<stdio.h>
#include<malloc.h>//1、在原代码上修订。2、改用for循环取代while循环
typedef struct poly {
    int factor;//系数
    int exp;//幂指数
    int use;//备用标志
    struct poly *next;
}POLY;
void create(POLY *F1,POLY *F2);
void show(POLY *F);
void clear(POLY *F);
int count(POLY *F);
//测试代码段:
void sum(POLY *F1, POLY *F2, POLY *Q) {
    int i1, i2 = 0;                    //循环变量
    POLY *S1 = F1;
    POLY *S2 = F2;
    POLY *P1;
    POLY *P2;
    POLY *S;
    POLY *P;
    S = Q;                            //结果变量 
    
    while (S1 != NULL)                                //!=(NULL=0)
    {    printf("**1_1**\n");//
        S2 = F2;
        while (S2 != NULL) {
            printf("***1_2***\n");//
            if (S1->exp == S2->exp) {
                printf("****1_3****(while-if循环)\n");//
                S->factor = S1->factor + S2->factor;
                S->exp = S1->exp;
                S1->use = 1;
                S2->use = 1;
                P = (POLY*)malloc(sizeof(POLY));
                S->next = P;
                S = P;
            }
            S2 = S2->next;
        }
        S1 = S1->next;
    }


    S1 = F1;                    //复位 
    S2 = F2;
    while (S1 != NULL) {
        printf("*****2_1*****\n");//
        if (S1->use == 0) {
            printf("******2_2******\n");//
            S->factor = S1->factor;
            S->exp = S1->exp;
            S1->use = 1;
            P = (POLY*)malloc(sizeof(POLY));//最后一项不见了,问题应该在这
            S->next = P;
            S = P;
        }
        S1 = S1->next;
    }
    while (S2 != NULL) {
        printf("*******3_1*******\n");//
        if (S2->use == 0) {
            printf("********3_2********\n");//
            S->factor = S2->factor;
            S->exp = S2->exp;
            S2->use = 1;
            P = (POLY*)malloc(sizeof(POLY));
            S->next = P;
            S = P;
        }
        S2 = S2->next;
    }
    S=NULL;

    
    show(Q);
    clear(Q);
}




//测试代码段: 
int main() {
    POLY p1 = {};
    POLY p2 = {};
    POLY l = {};//
    POLY *P1 = &p1;
    POLY *P2 = &p2;
    POLY *L = &l;//
    first:int n = 10;
    printf("\n***************数据结构综合性实验******************");
    printf("\n*******一、多项式的加法、减法、乘法运算**********");
    printf("\n*******        1.多项式创建            **********");
    printf("\n*******        2.多项式相加            **********");
    printf("\n*******        3.多项式相减            **********");
    printf("\n*******        4.多项式相乘            **********");
    printf("\n*******        5.清空多项式            **********");
    printf("\n*******         0.退出系统             **********");
    printf("\n*******        请选择(0—5)          **********");
    printf("\n*************************************************\n");
    printf("*请选择(0-5):\n");
    scanf("%d", &n);
    getchar();
    switch (n)
    {
    case 1:        create(P1, P2); goto first;
    case 2:        sum(P1, P2, L); goto first;
//    case 3: subduction(P1, P2); goto first;
//    case 4:        multiplication(P1, P2); goto first;
    case 5:        clear(P1); clear(P2); goto first;
    case 0:        goto last; 
    default:
        break;
    }


    last:return 0;
}

void create(POLY *F1, POLY *F2) {
    POLY *P;
    POLY *S = F1;
    int n = 0;
    int m = 0;
    int i1, i2 = 0;                            //循环变量
    printf("请输入第一个多项式项数\n");
    scanf("%d", &n);
    getchar();
    printf("请依次输入%d对系数和指数\n",n);
    for (i1 = 0; i1 < n; i1++) {
        scanf("%d", &S->factor);
        getchar();
        scanf("%d", &S->exp);
        getchar();
        if (i1 == (n - 1)) {
            S->next = NULL;
        }
        else {
            P = (POLY*)malloc(sizeof(POLY));
            S->next = P;
            S = P;
        }                                    //最后一项为NULL
    }

    S = F2;
    printf("请输入第二个多项式项数\n");
    scanf("%d", &m);
    getchar();
    printf("请依次输入%d对系数和指数\n",m);
    for (i2 = 0; i2 < m; i2++) {
        scanf("%d", &S->factor);
        getchar();
        scanf("%d", &S->exp);
        getchar();
        if (i2 == (m - 1)) {
            S->next = NULL;
        }
        else {
            P = (POLY*)malloc(sizeof(POLY));
            S->next = P;
            S = P;
        }                            //最后一项为NULL
    }
    show(F1);
    show(F2);
}
void clear(POLY *F) {
    POLY *S;
    POLY *P;
    POLY *Q;
    S = F;
    while (S != NULL)
    {
        P = S;
        S = S->next;
        free(P);
    }
}
void show(POLY *F) {
    POLY *S = F;
    printf("\n 方程式为 \n");
    int n=0;
    while (S != NULL) {
        if(n==0){
            printf("%d*x^%d", S->factor, S->exp);}
        if(S->factor>0&&n!=0){
            printf("+%d*x^%d", S->factor, S->exp);}
        if(S->factor<0){
            printf("-%d*x^%d", S->factor, S->exp);}
        S = S->next;
        n=n+1;
    }
    printf("\n");
}
int count(POLY *F) {
    POLY *S = F;
    int p=0;
    while (S->next!=NULL) {
        p = p + 1;
        S = S->next;
    }
    return p;
}//实际上并未用到

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。