鱼C论坛

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

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

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

  9. struct poly *CreatList(void);                        //创建一元多项式
  10. struct poly *Plus(struct poly *an, struct poly *bn); //多项式相加函数
  11. void Print(struct poly *P);
  12. int main(void)
  13. {
  14.     struct poly *an = NULL;
  15.     struct poly *bn = NULL;
  16.     struct poly *cn = NULL;

  17.     an = CreatList();
  18.     bn = CreatList();
  19.     cn = Plus(an, bn);
  20.     Print(cn);
  21.     return 0;
  22. }

  23. //创建函数
  24. struct poly *CreatList(void)
  25. {
  26.     struct poly *head = (struct poly *)malloc(sizeof(struct poly));
  27.     if (NULL == head)
  28.     {
  29.         printf("空间不足!");
  30.         return 0;
  31.     }

  32.     struct poly *tail = head;
  33.     tail->next = NULL;

  34.     int number; // 一元多项式的项数
  35.     int coef;
  36.     int index;

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

  43.     for (int i = 0; i < number; ++i)
  44.     {
  45.         printf("第%d项的系数是: ", i + 1);
  46.         scanf("%d", &coef);
  47.         printf("第%d项的指数是: x^", i + 1);
  48.         scanf("%d", &index);
  49.         printf("\n");
  50.         struct poly *GENERAL_TERM = (struct poly *)malloc(sizeof(struct poly));
  51.         if (NULL == GENERAL_TERM)
  52.         {
  53.             printf("空间不足!");
  54.             return 0;
  55.         }
  56.         GENERAL_TERM->coef = coef;
  57.         GENERAL_TERM->index = index;

  58.         tail->next = GENERAL_TERM;
  59.         GENERAL_TERM->next = NULL;
  60.         tail = GENERAL_TERM;
  61.         poly *p = NULL;
  62.         poly *q = NULL;
  63.         poly *t = NULL;
  64.         if (head == NULL || head->next == NULL)
  65.         {
  66.             return 0;
  67.         }
  68.         for (p = head; p != NULL; p = p->next)
  69.         {
  70.             for (q = head; q->next != NULL; q = q->next)
  71.             {
  72.                 if (q->index > q->next->index)
  73.                 {
  74.                     int m = q->index;
  75.                     int n = q->coef;
  76.                     q->index = q->next->index;
  77.                     q->next->index = m;
  78.                     q->coef = q->next->coef;
  79.                     q->coef = n;
  80.                 }
  81.             }
  82.         }
  83.     }
  84.     return (head);
  85. }

  86. //多项式相加函数
  87. struct poly *Plus(struct poly *an, struct poly *bn)
  88. {
  89.     struct poly *pa = an->next;
  90.     struct poly *pb = bn->next;
  91.     struct poly *cn = (struct poly *)malloc(sizeof(struct poly));
  92.     if (NULL == cn)
  93.     {
  94.         printf("空间不足!");
  95.         return 0;
  96.     }
  97.     struct poly *pc = cn;

  98.     while (pa && pb)
  99.     {
  100.         struct poly *pa_b = (struct poly *)malloc(sizeof(struct poly));
  101.         if (NULL == (pa_b))
  102.         {
  103.             printf("空间不足!");
  104.             return 0;
  105.         }
  106.         if (pa->index < pb->index)
  107.         {
  108.             pa_b->coef = pa->coef;
  109.             pa_b->index = pa->index;
  110.             pa = pa->next;

  111.             pc->next = pa_b;
  112.             pa_b->next = NULL;
  113.             pc = pa_b;
  114.         }
  115.         else if (pa->index == pb->index)
  116.         {
  117.             pa_b->coef = pa->coef + pb->coef;
  118.             pa_b->index = pa->index;
  119.             pa = pa->next;
  120.             pb = pb->next;

  121.             pc->next = pa_b;
  122.             pa_b->next = NULL;
  123.             pc = pa_b;
  124.         }
  125.         else
  126.         {
  127.             pa_b->coef = pb->coef;
  128.             pa_b->index = pb->index;
  129.             pb = pb->next;

  130.             pc->next = pa_b;
  131.             pa_b->next = NULL;
  132.             pc = pa_b;
  133.         }
  134.     }

  135.     if (pa == NULL)
  136.     {
  137.         while (pb)
  138.         {
  139.             struct poly *pa_b = (struct poly *)malloc(sizeof(struct poly));
  140.             if (NULL == pa_b)
  141.             {
  142.                 printf("空间不足!");
  143.                 return 0;
  144.             }

  145.             pa_b->coef = pb->coef;
  146.             pa_b->index = pb->index;
  147.             pb = pb->next;

  148.             pc->next = pa_b;
  149.             pa_b->next = NULL;
  150.             pc = pa_b;
  151.         }
  152.     }
  153.     else
  154.     {
  155.         while (pa)
  156.         {
  157.             struct poly *pa_b = (struct poly *)malloc(sizeof(struct poly));
  158.             if (NULL == pa_b)
  159.             {
  160.                 printf("空间不足!");
  161.                 return 0;
  162.             }

  163.             pa_b->coef = pa->coef;
  164.             pa_b->index = pa->index;
  165.             pa = pa->next;

  166.             pc->next = pa_b;
  167.             pa_b = NULL;
  168.             pc = pa_b;
  169.         }
  170.     }
  171.     return (cn);
  172. }
  173. //打印输出函数
  174. void Print(struct poly *P)
  175. {
  176.     int total_terms = 0;
  177.     struct poly *pointer = P->next;
  178.     while (pointer)
  179.     {
  180.         if (total_terms != 0)
  181.         {
  182.             printf("+");
  183.         }
  184.         printf("%dx^%d", pointer->coef, pointer->index);
  185.         pointer = pointer->next;
  186.         total_terms++;
  187.     }
  188.     printf("\n总项数为: %d\n", total_terms);
  189. }
复制代码

运行有时候正常,如图一
有时候陷入死循环,如图二
求大佬指点
最佳答案
2020-11-10 23:58:53
本帖最后由 jackz007 于 2020-11-13 11:46 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct node
  4. {
  5.     int coef                                                             ;
  6.     int index                                                            ;
  7.     struct node * next                                                   ;
  8. } poly                                                                   ;

  9. poly * FindNode(poly * h , int index)
  10. {
  11.         for(; h && h -> index != index ; h = h -> next)                  ;
  12.         return h                                                         ;
  13. }

  14. poly * CreatePoly(void)
  15. {
  16.         poly * h , * p , * q                                             ;
  17.         int f , k , m                                                    ;
  18.         printf("请输入一元多项式的项数: ")                               ;
  19.         fflush(stdin)                                                    ;
  20.         scanf("%d" , & m)                                                ;
  21.         for(h = NULL , p = NULL , f = 1 , k = 0 ; k < m ; k ++) {
  22.                 if((p = (poly *) malloc(sizeof(poly))) != NULL) {
  23.                         p -> next = NULL                                 ;
  24.                         printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
  25.                         fflush(stdin)                                    ;
  26.                         scanf("%d%d" , & p -> coef , & p -> index)       ;
  27.                         if(! k) h = p                                    ;
  28.                         else q -> next = p                               ;
  29.                         q = p                                            ;
  30.                 } else {
  31.                         fprintf(stderr , "空间不足!\n")                 ;
  32.                         f --                                             ;
  33.                         break                                            ;
  34.                 }
  35.         }
  36.         if(! f) h = NULL                                                 ;
  37.         return h                                                         ;
  38. }

  39. poly * PlusPoly(poly * ha)
  40. {
  41.         poly * h , * p , * q , * x                                       ;
  42.         int f , k , m  , n , coef , index                                ;
  43.         for(f = 1 , n = 0 ; ha ; ha = ha -> next , n ++) {
  44.                 if((p = (poly *) malloc(sizeof(poly))) != NULL) {
  45.                         p -> coef  = ha -> coef                          ;
  46.                         p -> index = ha -> index                         ;
  47.                         p -> next  = NULL                                ;
  48.                         if(! n) h = p                                    ;
  49.                         else q -> next = p                               ;
  50.                         q = p                                            ;
  51.                 } else {
  52.                         fprintf(stderr , "空间不足!\n")                 ;
  53.                         f --                                             ;
  54.                         break                                            ;
  55.                 }               
  56.         }
  57.         if(f) {
  58.                 printf("请输入一元多项式的项数: ")                       ;
  59.                 fflush(stdin)                                            ;
  60.                 scanf("%d" , & m)                                        ;
  61.                 for(k = 0 ; k < m ; k ++) {
  62.                         printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
  63.                         fflush(stdin)                                    ;
  64.                         scanf("%d%d" , & coef , & index)                 ;
  65.                         if((x = FindNode(h , index))) {
  66.                                 x -> coef += coef                        ;
  67.                         } else {
  68.                                 if((p = (poly *) malloc(sizeof(poly))) != NULL) {
  69.                                         p -> coef  = coef                ;
  70.                                         p -> index = index               ;
  71.                                         p -> next  = NULL                ;
  72.                                         if(! n) h = p                    ;
  73.                                         else q -> next = p               ;
  74.                                         q = p                            ;
  75.                                         n ++                             ;
  76.                                 } else {
  77.                                         fprintf(stderr , "空间不足!\n") ;
  78.                                         f --                             ;
  79.                                         break                            ;
  80.                                 }                        
  81.                         }               
  82.                 }
  83.         }
  84.         if(! f) h = NULL                                                 ;
  85.         return h                                                         ;
  86. }

  87. void PrintPoly(poly * h)
  88. {
  89.         int d , m                                                              ;
  90.         for(d = 0 , m = 0 ; h ; m ++ , h = h -> next) {
  91.                 if(h -> coef) {
  92.                         if(h -> coef < 0) printf(" - ")                        ;
  93.                         else if(d) printf(" + ")                               ;
  94.                         if(! h -> index) {
  95.                                 printf("%d" , abs(h -> coef))                  ;
  96.                         } else if(h -> index == 1) {
  97.                                 if(h -> coef == 1) printf("x")                 ;
  98.                                 else printf("%dx" , abs(h -> coef))            ;
  99.                         } else {
  100.                                 printf("%dx^%d" , abs(h -> coef) , h -> index) ;
  101.                         }
  102.                         d ++                                                   ;
  103.                 }
  104.         }
  105.         printf("\n总项数为: %d\n", d)                                          ;
  106. }

  107. void DestroyPoly(poly * h)
  108. {
  109.         poly * p                                                               ;
  110.         for(p = h ; h ; p = h) {
  111.                 h = h -> next                                                  ;
  112.                 free(p)                                                        ;
  113.         }
  114. }

  115. main(void)
  116. {
  117.         poly * ha , * hb                                                       ;
  118.         ha = CreatePoly()                                                      ;
  119.         printf("\n")                                                           ;
  120.         hb = PlusPoly(ha)                                                      ;
  121.         printf("\n")                                                           ;
  122.         PrintPoly(hb)                                                          ;
  123.         DestroyPoly(ha)                                                        ;
  124.         DestroyPoly(hb)                                                        ;
  125. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

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

  6. 请输入一元多项式的项数: 4
  7. 请输入第 1 项的系数和指数 : 2 2
  8. 请输入第 2 项的系数和指数 : 4 4
  9. 请输入第 3 项的系数和指数 : 3 3
  10. 请输入第 4 项的系数和指数 : 1 1

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

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

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

  19. 3x^3 + 2x
  20. 总项数为: 2

  21. D:\0002.Exercise\C>
复制代码

图一

图一
QQ图片20201110232200.png

最佳答案

查看完整内容

编译、运行实况:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  3. typedef struct node
  4. {
  5.     int coef                                                             ;
  6.     int index                                                            ;
  7.     struct node * next                                                   ;
  8. } poly                                                                   ;

  9. poly * FindNode(poly * h , int index)
  10. {
  11.         for(; h && h -> index != index ; h = h -> next)                  ;
  12.         return h                                                         ;
  13. }

  14. poly * CreatePoly(void)
  15. {
  16.         poly * h , * p , * q                                             ;
  17.         int f , k , m                                                    ;
  18.         printf("请输入一元多项式的项数: ")                               ;
  19.         fflush(stdin)                                                    ;
  20.         scanf("%d" , & m)                                                ;
  21.         for(h = NULL , p = NULL , f = 1 , k = 0 ; k < m ; k ++) {
  22.                 if((p = (poly *) malloc(sizeof(poly))) != NULL) {
  23.                         p -> next = NULL                                 ;
  24.                         printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
  25.                         fflush(stdin)                                    ;
  26.                         scanf("%d%d" , & p -> coef , & p -> index)       ;
  27.                         if(! k) h = p                                    ;
  28.                         else q -> next = p                               ;
  29.                         q = p                                            ;
  30.                 } else {
  31.                         fprintf(stderr , "空间不足!\n")                 ;
  32.                         f --                                             ;
  33.                         break                                            ;
  34.                 }
  35.         }
  36.         if(! f) h = NULL                                                 ;
  37.         return h                                                         ;
  38. }

  39. poly * PlusPoly(poly * ha)
  40. {
  41.         poly * h , * p , * q , * x                                       ;
  42.         int f , k , m  , n , coef , index                                ;
  43.         for(f = 1 , n = 0 ; ha ; ha = ha -> next , n ++) {
  44.                 if((p = (poly *) malloc(sizeof(poly))) != NULL) {
  45.                         p -> coef  = ha -> coef                          ;
  46.                         p -> index = ha -> index                         ;
  47.                         p -> next  = NULL                                ;
  48.                         if(! n) h = p                                    ;
  49.                         else q -> next = p                               ;
  50.                         q = p                                            ;
  51.                 } else {
  52.                         fprintf(stderr , "空间不足!\n")                 ;
  53.                         f --                                             ;
  54.                         break                                            ;
  55.                 }               
  56.         }
  57.         if(f) {
  58.                 printf("请输入一元多项式的项数: ")                       ;
  59.                 fflush(stdin)                                            ;
  60.                 scanf("%d" , & m)                                        ;
  61.                 for(k = 0 ; k < m ; k ++) {
  62.                         printf("请输入第 %d 项的系数和指数 : " , k + 1)  ;
  63.                         fflush(stdin)                                    ;
  64.                         scanf("%d%d" , & coef , & index)                 ;
  65.                         if((x = FindNode(h , index))) {
  66.                                 x -> coef += coef                        ;
  67.                         } else {
  68.                                 if((p = (poly *) malloc(sizeof(poly))) != NULL) {
  69.                                         p -> coef  = coef                ;
  70.                                         p -> index = index               ;
  71.                                         p -> next  = NULL                ;
  72.                                         if(! n) h = p                    ;
  73.                                         else q -> next = p               ;
  74.                                         q = p                            ;
  75.                                         n ++                             ;
  76.                                 } else {
  77.                                         fprintf(stderr , "空间不足!\n") ;
  78.                                         f --                             ;
  79.                                         break                            ;
  80.                                 }                        
  81.                         }               
  82.                 }
  83.         }
  84.         if(! f) h = NULL                                                 ;
  85.         return h                                                         ;
  86. }

  87. void PrintPoly(poly * h)
  88. {
  89.         int d , m                                                              ;
  90.         for(d = 0 , m = 0 ; h ; m ++ , h = h -> next) {
  91.                 if(h -> coef) {
  92.                         if(h -> coef < 0) printf(" - ")                        ;
  93.                         else if(d) printf(" + ")                               ;
  94.                         if(! h -> index) {
  95.                                 printf("%d" , abs(h -> coef))                  ;
  96.                         } else if(h -> index == 1) {
  97.                                 if(h -> coef == 1) printf("x")                 ;
  98.                                 else printf("%dx" , abs(h -> coef))            ;
  99.                         } else {
  100.                                 printf("%dx^%d" , abs(h -> coef) , h -> index) ;
  101.                         }
  102.                         d ++                                                   ;
  103.                 }
  104.         }
  105.         printf("\n总项数为: %d\n", d)                                          ;
  106. }

  107. void DestroyPoly(poly * h)
  108. {
  109.         poly * p                                                               ;
  110.         for(p = h ; h ; p = h) {
  111.                 h = h -> next                                                  ;
  112.                 free(p)                                                        ;
  113.         }
  114. }

  115. main(void)
  116. {
  117.         poly * ha , * hb                                                       ;
  118.         ha = CreatePoly()                                                      ;
  119.         printf("\n")                                                           ;
  120.         hb = PlusPoly(ha)                                                      ;
  121.         printf("\n")                                                           ;
  122.         PrintPoly(hb)                                                          ;
  123.         DestroyPoly(ha)                                                        ;
  124.         DestroyPoly(hb)                                                        ;
  125. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

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

  6. 请输入一元多项式的项数: 4
  7. 请输入第 1 项的系数和指数 : 2 2
  8. 请输入第 2 项的系数和指数 : 4 4
  9. 请输入第 3 项的系数和指数 : 3 3
  10. 请输入第 4 项的系数和指数 : 1 1

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

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

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

  19. 3x^3 + 2x
  20. 总项数为: 2

  21. D:\0002.Exercise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

能说下问题具体原因吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-9 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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