|
发表于 2023-3-25 16:00:35
|
显示全部楼层
在 main 函数中调用 Add(&pa, &pb) 后,程序没有直接退出。但是,由于在 Add 函数中没有返回任何值,也没有对 pa 和 pb 的指针进行修改,因此 main 函数输出的结果仍然是原先的两个链表 pa 和 pb。
可能是你没有在 Print 函数中打印出换行符,导致最后输出的结果和输入提示信息连在一起,看起来像是程序直接退出了。你可以在 Print 函数中加上 putchar('\n') 来打印出一个换行符,使输出结果更加清晰。
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct Node {
- int coef; // 系数
- int exp; // 指数
- struct Node *next;
- } Node, *LinkList;
- // 创建一个新节点
- Node *new_node(int coef, int exp) {
- Node *newNode = (Node*)malloc(sizeof(Node));
- newNode->coef = coef;
- newNode->exp = exp;
- newNode->next = NULL;
- return newNode;
- }
- // 向链表末尾添加一个节点
- void add_node(LinkList *list, Node *node) {
- Node *p = *list;
- while (p->next != NULL) {
- p = p->next;
- }
- p->next = node;
- }
- // 读取多项式
- void read_polynomial(LinkList *list) {
- int n;
- printf("How many terms are there in the polynomial: ");
- scanf("%d", &n);
- printf("Input each term: \n");
- for (int i = 0; i < n; i++) {
- int coef, exp;
- scanf("%d%d", &coef, &exp);
- Node *newNode = new_node(coef, exp);
- add_node(list, newNode);
- }
- }
- // 打印多项式
- void print_polynomial(LinkList list) {
- Node *p = list->next;
- while (p != NULL) {
- printf("%d %d ", p->coef, p->exp);
- p = p->next;
- }
- putchar('\n');
- }
- // 合并两个多项式
- LinkList merge_polynomial(LinkList pa, LinkList pb) {
- LinkList pab, p, q;
- Node *newNode;
- p = pa->next;
- q = pb->next;
- pab = (LinkList)malloc(sizeof(Node));
- pab->next = NULL;
- while (p != NULL && q != NULL) {
- if (p->exp < q->exp) {
- newNode = new_node(p->coef, p->exp);
- add_node(&pab, newNode);
- p = p->next;
- } else if (p->exp > q->exp) {
- newNode = new_node(q->coef, q->exp);
- add_node(&pab, newNode);
- q = q->next;
- } else {
- int coef = p->coef + q->coef;
- if (coef != 0) {
- newNode = new_node(coef, p->exp);
- add_node(&pab, newNode);
- }
- p = p->next;
- q = q->next;
- }
- }
- while (p != NULL) {
- newNode = new_node(p->coef, p->exp);
- add_node(&pab, newNode);
- p = p->next;
- }
- while (q != NULL) {
- newNode = new_node(q->coef, q->exp);
- add_node(&pab, newNode);
- q = q->next;
- }
- return pab;
- }
- int main(void) {
- LinkList pa, pb, pab;
- pa = (LinkList)malloc(sizeof(Node));
- pb = (LinkList)malloc(sizeof(Node));
- pa->next = NULL;
- pb->next = NULL;
- read_polynomial(&pa);
- print_polynomial(pa);
- read_polynomial(&pb);
- print_polynomial(pb);
- pab = merge_polynomial(pa, pb);
- print_polynomial(pab);
- return 0;
- }
- 注释中对代码进行了简化,主要修改如下:
- 将 Create 函数替换为 read_polynomial 函数,直接读取多项式的系数和指数,并将其添加到链表中;
- 将 Print 函数替换为 print_polynomial 函数,直接打印多项式;
- 将 Add 函数替换为 merge_polynomial 函数,直接合并两个多项式并返回结果链表;
- 使用 typedef 定义了 Node 和 LinkList,使代码更加简洁易读;
- 使用动态内存分配 malloc 分配链表头节点,避免了静态数组大小的限制。
复制代码 |
|