鱼C论坛

 找回密码
 立即注册
查看: 1140|回复: 2

[已解决]新人发帖,请问下陷入死循环的原因

[复制链接]
发表于 2020-11-10 23:58:52 | 显示全部楼层 |阅读模式
15鱼币
#include <stdio.h>
#include <malloc.h>
struct poly
{
    int coef;
    int index;
    struct poly *next; //多项式后继指针
};

struct poly *CreatList(void);                        //创建一元多项式
struct poly *Plus(struct poly *an, struct poly *bn); //多项式相加函数
void Print(struct poly *P);
int main(void)
{
    struct poly *an = NULL;
    struct poly *bn = NULL;
    struct poly *cn = NULL;

    an = CreatList();
    bn = CreatList();
    cn = Plus(an, bn);
    Print(cn);
    return 0;
}

//创建函数
struct poly *CreatList(void)
{
    struct poly *head = (struct poly *)malloc(sizeof(struct poly));
    if (NULL == head)
    {
        printf("空间不足!");
        return 0;
    }

    struct poly *tail = head;
    tail->next = NULL;

    int number; // 一元多项式的项数
    int coef;
    int index;

    printf("请输入一元多项式的项数: ");
    scanf("%d", &number);
    if (number == 0)
    {
        head->next = NULL;
    }

    for (int i = 0; i < number; ++i)
    {
        printf("第%d项的系数是: ", i + 1);
        scanf("%d", &coef);
        printf("第%d项的指数是: x^", i + 1);
        scanf("%d", &index);
        printf("\n");
        struct poly *GENERAL_TERM = (struct poly *)malloc(sizeof(struct poly));
        if (NULL == GENERAL_TERM)
        {
            printf("空间不足!");
            return 0;
        }
        GENERAL_TERM->coef = coef;
        GENERAL_TERM->index = index;

        tail->next = GENERAL_TERM;
        GENERAL_TERM->next = NULL;
        tail = GENERAL_TERM;
        poly *p = NULL;
        poly *q = NULL;
        poly *t = NULL;
        if (head == NULL || head->next == NULL)
        {
            return 0;
        }
        for (p = head; p != NULL; p = p->next)
        {
            for (q = head; q->next != NULL; q = q->next)
            {
                if (q->index > q->next->index)
                {
                    int m = q->index;
                    int n = q->coef;
                    q->index = q->next->index;
                    q->next->index = m;
                    q->coef = q->next->coef;
                    q->coef = n;
                }
            }
        }
    }
    return (head);
}

//多项式相加函数
struct poly *Plus(struct poly *an, struct poly *bn)
{
    struct poly *pa = an->next;
    struct poly *pb = bn->next;
    struct poly *cn = (struct poly *)malloc(sizeof(struct poly));
    if (NULL == cn)
    {
        printf("空间不足!");
        return 0;
    }
    struct poly *pc = cn;

    while (pa && pb)
    {
        struct poly *pa_b = (struct poly *)malloc(sizeof(struct poly));
        if (NULL == (pa_b))
        {
            printf("空间不足!");
            return 0;
        }
        if (pa->index < pb->index)
        {
            pa_b->coef = pa->coef;
            pa_b->index = pa->index;
            pa = pa->next;

            pc->next = pa_b;
            pa_b->next = NULL;
            pc = pa_b;
        }
        else if (pa->index == pb->index)
        {
            pa_b->coef = pa->coef + pb->coef;
            pa_b->index = pa->index;
            pa = pa->next;
            pb = pb->next;

            pc->next = pa_b;
            pa_b->next = NULL;
            pc = pa_b;
        }
        else
        {
            pa_b->coef = pb->coef;
            pa_b->index = pb->index;
            pb = pb->next;

            pc->next = pa_b;
            pa_b->next = NULL;
            pc = pa_b;
        }
    }

    if (pa == NULL)
    {
        while (pb)
        {
            struct poly *pa_b = (struct poly *)malloc(sizeof(struct poly));
            if (NULL == pa_b)
            {
                printf("空间不足!");
                return 0;
            }

            pa_b->coef = pb->coef;
            pa_b->index = pb->index;
            pb = pb->next;

            pc->next = pa_b;
            pa_b->next = NULL;
            pc = pa_b;
        }
    }
    else
    {
        while (pa)
        {
            struct poly *pa_b = (struct poly *)malloc(sizeof(struct poly));
            if (NULL == pa_b)
            {
                printf("空间不足!");
                return 0;
            }

            pa_b->coef = pa->coef;
            pa_b->index = pa->index;
            pa = pa->next;

            pc->next = pa_b;
            pa_b = NULL;
            pc = pa_b;
        }
    }
    return (cn);
}
//打印输出函数
void Print(struct poly *P)
{
    int total_terms = 0;
    struct poly *pointer = P->next;
    while (pointer)
    {
        if (total_terms != 0)
        {
            printf("+");
        }
        printf("%dx^%d", pointer->coef, pointer->index);
        pointer = pointer->next;
        total_terms++;
    }
    printf("\n总项数为: %d\n", total_terms);
}
运行有时候正常,如图一
有时候陷入死循环,如图二
求大佬指点
最佳答案
2020-11-10 23:58:53
本帖最后由 jackz007 于 2020-11-13 11:46 编辑
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int coef                                                             ;
    int index                                                            ;
    struct node * next                                                   ;
} poly                                                                   ;

poly * FindNode(poly * h , int index)
{
        for(; h && h -> index != index ; h = h -> next)                  ;
        return h                                                         ;
}

poly * CreatePoly(void)
{
        poly * h , * p , * q                                             ;
        int f , k , m                                                    ;
        printf("请输入一元多项式的项数: ")                               ;
        fflush(stdin)                                                    ;
        scanf("%d" , & m)                                                ;
        for(h = NULL , p = NULL , f = 1 , k = 0 ; k < m ; k ++) {
                if((p = (poly *) malloc(sizeof(poly))) != NULL) {
                        p -> next = NULL                                 ;
                        printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
                        fflush(stdin)                                    ;
                        scanf("%d%d" , & p -> coef , & p -> index)       ;
                        if(! k) h = p                                    ;
                        else q -> next = p                               ;
                        q = p                                            ;
                } else {
                        fprintf(stderr , "空间不足!\n")                 ;
                        f --                                             ;
                        break                                            ;
                }
        }
        if(! f) h = NULL                                                 ;
        return h                                                         ;
}

poly * PlusPoly(poly * ha)
{
        poly * h , * p , * q , * x                                       ;
        int f , k , m  , n , coef , index                                ;
        for(f = 1 , n = 0 ; ha ; ha = ha -> next , n ++) {
                if((p = (poly *) malloc(sizeof(poly))) != NULL) {
                        p -> coef  = ha -> coef                          ;
                        p -> index = ha -> index                         ;
                        p -> next  = NULL                                ;
                        if(! n) h = p                                    ;
                        else q -> next = p                               ;
                        q = p                                            ;
                } else {
                        fprintf(stderr , "空间不足!\n")                 ;
                        f --                                             ;
                        break                                            ;
                }                
        }
        if(f) {
                printf("请输入一元多项式的项数: ")                       ;
                fflush(stdin)                                            ;
                scanf("%d" , & m)                                        ;
                for(k = 0 ; k < m ; k ++) {
                        printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
                        fflush(stdin)                                    ;
                        scanf("%d%d" , & coef , & index)                 ;
                        if((x = FindNode(h , index))) {
                                x -> coef += coef                        ; 
                        } else {
                                if((p = (poly *) malloc(sizeof(poly))) != NULL) {
                                        p -> coef  = coef                ;
                                        p -> index = index               ;
                                        p -> next  = NULL                ;
                                        if(! n) h = p                    ;
                                        else q -> next = p               ;
                                        q = p                            ;
                                        n ++                             ;
                                } else {
                                        fprintf(stderr , "空间不足!\n") ;
                                        f --                             ;
                                        break                            ; 
                                }                        
                        }               
                }
        }
        if(! f) h = NULL                                                 ;
        return h                                                         ;
}

void PrintPoly(poly * h)
{
        int d , m                                                              ;
        for(d = 0 , m = 0 ; h ; m ++ , h = h -> next) {
                if(h -> coef) {
                        if(h -> coef < 0) printf(" - ")                        ;
                        else if(d) printf(" + ")                               ;
                        if(! h -> index) {
                                printf("%d" , abs(h -> coef))                  ;
                        } else if(h -> index == 1) {
                                if(h -> coef == 1) printf("x")                 ;
                                else printf("%dx" , abs(h -> coef))            ;
                        } else {
                                printf("%dx^%d" , abs(h -> coef) , h -> index) ;
                        }
                        d ++                                                   ;
                }
        }
        printf("\n总项数为: %d\n", d)                                          ;
}

void DestroyPoly(poly * h)
{
        poly * p                                                               ;
        for(p = h ; h ; p = h) {
                h = h -> next                                                  ;
                free(p)                                                        ;
        }
}

main(void)
{
        poly * ha , * hb                                                       ;
        ha = CreatePoly()                                                      ;
        printf("\n")                                                           ;
        hb = PlusPoly(ha)                                                      ;
        printf("\n")                                                           ;
        PrintPoly(hb)                                                          ;
        DestroyPoly(ha)                                                        ;
        DestroyPoly(hb)                                                        ;
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
请输入一元多项式的项数: 2
请输入第 1 项的系数和指数 : 3 3
请输入第 2 项的系数和指数 : 2 2

请输入一元多项式的项数: 4
请输入第 1 项的系数和指数 : 2 2
请输入第 2 项的系数和指数 : 4 4
请输入第 3 项的系数和指数 : 3 3
请输入第 4 项的系数和指数 : 1 1

4x^2 + 4x^4 + 6x^3 + x
总项数为: 4

D:\0002.Exercise\C>x
请输入一元多项式的项数: 2
请输入第 1 项的系数和指数 : 3 3
请输入第 2 项的系数和指数 : 1 1

请输入一元多项式的项数: 1
请输入第 1 项的系数和指数 : 1 1

3x^3 + 2x
总项数为: 2

D:\0002.Exercise\C>

图一

图一
QQ图片20201110232200.png

最佳答案

查看完整内容

编译、运行实况:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-10 23:58:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-13 11:46 编辑
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int coef                                                             ;
    int index                                                            ;
    struct node * next                                                   ;
} poly                                                                   ;

poly * FindNode(poly * h , int index)
{
        for(; h && h -> index != index ; h = h -> next)                  ;
        return h                                                         ;
}

poly * CreatePoly(void)
{
        poly * h , * p , * q                                             ;
        int f , k , m                                                    ;
        printf("请输入一元多项式的项数: ")                               ;
        fflush(stdin)                                                    ;
        scanf("%d" , & m)                                                ;
        for(h = NULL , p = NULL , f = 1 , k = 0 ; k < m ; k ++) {
                if((p = (poly *) malloc(sizeof(poly))) != NULL) {
                        p -> next = NULL                                 ;
                        printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
                        fflush(stdin)                                    ;
                        scanf("%d%d" , & p -> coef , & p -> index)       ;
                        if(! k) h = p                                    ;
                        else q -> next = p                               ;
                        q = p                                            ;
                } else {
                        fprintf(stderr , "空间不足!\n")                 ;
                        f --                                             ;
                        break                                            ;
                }
        }
        if(! f) h = NULL                                                 ;
        return h                                                         ;
}

poly * PlusPoly(poly * ha)
{
        poly * h , * p , * q , * x                                       ;
        int f , k , m  , n , coef , index                                ;
        for(f = 1 , n = 0 ; ha ; ha = ha -> next , n ++) {
                if((p = (poly *) malloc(sizeof(poly))) != NULL) {
                        p -> coef  = ha -> coef                          ;
                        p -> index = ha -> index                         ;
                        p -> next  = NULL                                ;
                        if(! n) h = p                                    ;
                        else q -> next = p                               ;
                        q = p                                            ;
                } else {
                        fprintf(stderr , "空间不足!\n")                 ;
                        f --                                             ;
                        break                                            ;
                }                
        }
        if(f) {
                printf("请输入一元多项式的项数: ")                       ;
                fflush(stdin)                                            ;
                scanf("%d" , & m)                                        ;
                for(k = 0 ; k < m ; k ++) {
                        printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
                        fflush(stdin)                                    ;
                        scanf("%d%d" , & coef , & index)                 ;
                        if((x = FindNode(h , index))) {
                                x -> coef += coef                        ; 
                        } else {
                                if((p = (poly *) malloc(sizeof(poly))) != NULL) {
                                        p -> coef  = coef                ;
                                        p -> index = index               ;
                                        p -> next  = NULL                ;
                                        if(! n) h = p                    ;
                                        else q -> next = p               ;
                                        q = p                            ;
                                        n ++                             ;
                                } else {
                                        fprintf(stderr , "空间不足!\n") ;
                                        f --                             ;
                                        break                            ; 
                                }                        
                        }               
                }
        }
        if(! f) h = NULL                                                 ;
        return h                                                         ;
}

void PrintPoly(poly * h)
{
        int d , m                                                              ;
        for(d = 0 , m = 0 ; h ; m ++ , h = h -> next) {
                if(h -> coef) {
                        if(h -> coef < 0) printf(" - ")                        ;
                        else if(d) printf(" + ")                               ;
                        if(! h -> index) {
                                printf("%d" , abs(h -> coef))                  ;
                        } else if(h -> index == 1) {
                                if(h -> coef == 1) printf("x")                 ;
                                else printf("%dx" , abs(h -> coef))            ;
                        } else {
                                printf("%dx^%d" , abs(h -> coef) , h -> index) ;
                        }
                        d ++                                                   ;
                }
        }
        printf("\n总项数为: %d\n", d)                                          ;
}

void DestroyPoly(poly * h)
{
        poly * p                                                               ;
        for(p = h ; h ; p = h) {
                h = h -> next                                                  ;
                free(p)                                                        ;
        }
}

main(void)
{
        poly * ha , * hb                                                       ;
        ha = CreatePoly()                                                      ;
        printf("\n")                                                           ;
        hb = PlusPoly(ha)                                                      ;
        printf("\n")                                                           ;
        PrintPoly(hb)                                                          ;
        DestroyPoly(ha)                                                        ;
        DestroyPoly(hb)                                                        ;
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
请输入一元多项式的项数: 2
请输入第 1 项的系数和指数 : 3 3
请输入第 2 项的系数和指数 : 2 2

请输入一元多项式的项数: 4
请输入第 1 项的系数和指数 : 2 2
请输入第 2 项的系数和指数 : 4 4
请输入第 3 项的系数和指数 : 3 3
请输入第 4 项的系数和指数 : 1 1

4x^2 + 4x^4 + 6x^3 + x
总项数为: 4

D:\0002.Exercise\C>x
请输入一元多项式的项数: 2
请输入第 1 项的系数和指数 : 3 3
请输入第 2 项的系数和指数 : 1 1

请输入一元多项式的项数: 1
请输入第 1 项的系数和指数 : 1 1

3x^3 + 2x
总项数为: 2

D:\0002.Exercise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-21 17:14:41 | 显示全部楼层
jackz007 发表于 2020-11-10 23:58
编译、运行实况:

能说下问题具体原因吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表