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