|  | 
 
 发表于 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 分配链表头节点,避免了静态数组大小的限制。
 | 
 |