鱼C论坛

 找回密码
 立即注册
查看: 3716|回复: 13

用两链表解决两多项式求和问题

[复制链接]
发表于 2023-3-25 16:00:35 | 显示全部楼层
在 main 函数中调用 Add(&pa, &pb) 后,程序没有直接退出。但是,由于在 Add 函数中没有返回任何值,也没有对 pa 和 pb 的指针进行修改,因此 main 函数输出的结果仍然是原先的两个链表 pa 和 pb。

可能是你没有在 Print 函数中打印出换行符,导致最后输出的结果和输入提示信息连在一起,看起来像是程序直接退出了。你可以在 Print 函数中加上 putchar('\n') 来打印出一个换行符,使输出结果更加清晰。


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct Node {
  4.     int coef;       // 系数
  5.     int exp;        // 指数
  6.     struct Node *next;
  7. } Node, *LinkList;

  8. // 创建一个新节点
  9. Node *new_node(int coef, int exp) {
  10.     Node *newNode = (Node*)malloc(sizeof(Node));
  11.     newNode->coef = coef;
  12.     newNode->exp = exp;
  13.     newNode->next = NULL;
  14.     return newNode;
  15. }

  16. // 向链表末尾添加一个节点
  17. void add_node(LinkList *list, Node *node) {
  18.     Node *p = *list;
  19.     while (p->next != NULL) {
  20.         p = p->next;
  21.     }
  22.     p->next = node;
  23. }

  24. // 读取多项式
  25. void read_polynomial(LinkList *list) {
  26.     int n;
  27.     printf("How many terms are there in the polynomial: ");
  28.     scanf("%d", &n);
  29.     printf("Input each term: \n");
  30.     for (int i = 0; i < n; i++) {
  31.         int coef, exp;
  32.         scanf("%d%d", &coef, &exp);
  33.         Node *newNode = new_node(coef, exp);
  34.         add_node(list, newNode);
  35.     }
  36. }

  37. // 打印多项式
  38. void print_polynomial(LinkList list) {
  39.     Node *p = list->next;
  40.     while (p != NULL) {
  41.         printf("%d %d ", p->coef, p->exp);
  42.         p = p->next;
  43.     }
  44.     putchar('\n');
  45. }

  46. // 合并两个多项式
  47. LinkList merge_polynomial(LinkList pa, LinkList pb) {
  48.     LinkList pab, p, q;
  49.     Node *newNode;
  50.     p = pa->next;
  51.     q = pb->next;
  52.     pab = (LinkList)malloc(sizeof(Node));
  53.     pab->next = NULL;
  54.     while (p != NULL && q != NULL) {
  55.         if (p->exp < q->exp) {
  56.             newNode = new_node(p->coef, p->exp);
  57.             add_node(&pab, newNode);
  58.             p = p->next;
  59.         } else if (p->exp > q->exp) {
  60.             newNode = new_node(q->coef, q->exp);
  61.             add_node(&pab, newNode);
  62.             q = q->next;
  63.         } else {
  64.             int coef = p->coef + q->coef;
  65.             if (coef != 0) {
  66.                 newNode = new_node(coef, p->exp);
  67.                 add_node(&pab, newNode);
  68.             }
  69.             p = p->next;
  70.             q = q->next;
  71.         }
  72.     }
  73.     while (p != NULL) {
  74.         newNode = new_node(p->coef, p->exp);
  75.         add_node(&pab, newNode);
  76.         p = p->next;
  77.     }
  78.     while (q != NULL) {
  79.         newNode = new_node(q->coef, q->exp);
  80.         add_node(&pab, newNode);
  81.         q = q->next;
  82.     }
  83.     return pab;
  84. }

  85. int main(void) {
  86.     LinkList pa, pb, pab;
  87.     pa = (LinkList)malloc(sizeof(Node));
  88.     pb = (LinkList)malloc(sizeof(Node));
  89.     pa->next = NULL;
  90.     pb->next = NULL;
  91.     read_polynomial(&pa);
  92.     print_polynomial(pa);
  93.     read_polynomial(&pb);
  94.     print_polynomial(pb);
  95.     pab = merge_polynomial(pa, pb);
  96.     print_polynomial(pab);
  97.     return 0;
  98. }
  99. 注释中对代码进行了简化,主要修改如下:

  100. 将 Create 函数替换为 read_polynomial 函数,直接读取多项式的系数和指数,并将其添加到链表中;
  101. 将 Print 函数替换为 print_polynomial 函数,直接打印多项式;
  102. 将 Add 函数替换为 merge_polynomial 函数,直接合并两个多项式并返回结果链表;
  103. 使用 typedef 定义了 Node 和 LinkList,使代码更加简洁易读;
  104. 使用动态内存分配 malloc 分配链表头节点,避免了静态数组大小的限制。
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 15:58:22 | 显示全部楼层
zerotwo020202 发表于 2023-3-25 22:19
大佬,虽然你的答案是对的,但是没有解决我的问题,我想知道的是为什么我的有错误,错误在哪?您刚才说的 ...

在Add函数中,pab和pB变量应该声明为指向Lnode结构体类型的指针,而不是LinkList类型的指针。因此,函数签名应该是void Add(Lnode **pa, Lnode **pb),并且在函数中应该使用->操作符而不是*操作符。

在Create函数中,应该使用&操作符将指针的地址传递给scanf函数,而不是指针本身。因此,应该使用scanf("%d%d", &t.coef, &t.expn);。

在Print函数中,应该使用->操作符而不是*操作符。

在main函数中,如果pa或pb指向的节点为空,那么在调用Add函数时会出现空指针引用错误。因此,应该在调用Add函数之前检查它们是否为空。

在Add函数中,当pab或pB到达链表的末尾时,应该退出循环而不是继续执行。

在Delete函数中,应该使用free函数释放节点的内存空间。

在main函数中,当pa或pb指向的节点为空时,Delete函数可能会引起空指针引用错误。应该在调用Delete函数之前检查它们是否为空。

在main函数中,应该释放pa和pb的内存空间。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-30 06:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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