Files
studycode/datastructure/2025301205+施光甲+实验二.cpp
2025-12-03 23:08:39 +08:00

257 lines
6.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PNode
{
int index; //指数
int coe; // 系数
struct PNode *next; //指针域
}PNode,*Polynomial;
// 初始化三个多项式链表
void chushihua(Polynomial *L, Polynomial *M, Polynomial *N)
{
//todo list 1: 为三个链表分配头节点并初始化
*L = (Polynomial)malloc(sizeof(PNode));
(*L)->next = NULL;
*M = (Polynomial)malloc(sizeof(PNode));
(*M)->next = NULL;
*N = (Polynomial)malloc(sizeof(PNode));
(*N)->next = NULL;
}
// 判断链表是否为空
void Emp(Polynomial L)
{
if (L->next == NULL)
printf("链表为空表。\n");
else
printf("链表为非空表。\n");
}
// 求链表长度
void Length(Polynomial L)
{
PNode *p;
int length = 0;
//todo list 2: 遍历链表统计节点个数
p = L->next;
while (p != NULL) {
length++;
p = p->next;
}
printf("链表长度为:%d\n", length);
}
// 1、构造两个按指数递增的有序链表插入节点创建一元多项式
// 1、构造两个按指数递增的有序链表插入节点创建一元多项式
void charu_1(Polynomial L) {
PNode *q, *p;
int n, i;
printf("请输入你要创建的一元多项式的项数:\n");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
p = L;
q = (Polynomial)malloc(sizeof(PNode));
printf("请输入第%d项的系数和指数", i);
scanf("%d%d", &q->coe, &q->index);
q->next = NULL;
// 查找插入位置,保持指数递增
while (p->next != NULL && p->next->index < q->index) {
//todo list 3: p指针移动到合适的位置
p = p->next;
}
// 直接插入,不合并相同指数的项
//todo list 4: 将*q结点插入到*p结点后
q->next = p->next;
p->next = q;
}
}
// 显示函数 - 使用H分隔系数和指数
void xianshi(Polynomial L)
{
PNode *p;
p = L->next;
if (p == NULL) {
printf("多项式为空");
return;
}
while (p != NULL)
{
printf("%dH%d", p->coe, p->index); // 系数H指数
p = p->next;
if (p != NULL) {
printf(" "); // 项之间的分隔
}
}
printf("\n");
}
//2、两个一元多项式相加
void hebiao(Polynomial J, Polynomial O, Polynomial H)
{
PNode *p = J->next, *q = O->next, *r = H, *s;
// 初始化结果链表
H->next = NULL;
while (p != NULL && q != NULL) {
if (p->index < q->index) {
s = (Polynomial)malloc(sizeof(PNode));
//todo list 5: 复制p节点的数据到新节点s
s->coe = p->coe;
s->index = p->index;
s->next = NULL;
//todo list 6: 将s节点插入到结果链表H的末尾
r->next = s;
r = s;
p = p->next;
} else if (p->index > q->index) {
s = (Polynomial)malloc(sizeof(PNode));
//todo list 7: 复制q节点的数据到新节点s
s->coe = q->coe;
s->index = q->index;
s->next = NULL;
//todo list 8: 将s节点插入到结果链表H的末尾
r->next = s;
r = s;
q = q->next;
} else {
//todo list 9: 处理指数相等的项
int sum = p->coe + q->coe;
if (sum != 0) {
s = (Polynomial)malloc(sizeof(PNode));
s->index = p->index;
s->coe = sum;
s->next = NULL;
//todo list 10: 将合并后的项插入结果链表
r->next = s;
r = s;
}
p = p->next;
q = q->next;
}
}
//todo list 11: 处理剩余节点 - 多项式J
while (p != NULL) {
s = (Polynomial)malloc(sizeof(PNode));
s->coe = p->coe;
s->index = p->index;
s->next = NULL;
r->next = s;
r = s;
p = p->next;
}
//todo list 12: 处理剩余节点 - 多项式O
while (q != NULL) {
s = (Polynomial)malloc(sizeof(PNode));
s->coe = q->coe;
s->index = q->index;
s->next = NULL;
r->next = s;
r = s;
q = q->next;
}
printf("两个多项式相加的结果为:");
xianshi(H);
}
// 清空链表函数
void clearList(Polynomial L) {
PNode *p = L->next;
while (p != NULL) {
PNode *temp = p;
p = p->next;
free(temp);
}
L->next = NULL;
}
int main()
{
Polynomial head[3];
int i;
for (i = 0; i < 3; i++) {
head[i] = (Polynomial)malloc(sizeof(PNode));
head[i]->next = NULL;
}
int choose = -1;
printf("*********************************************************\n");
printf("********** 实验二 *******\n");
printf("*********************************************************\n");
printf("********** 1.初始化单链表 *******\n");
printf("********** 2.建立递增链表(按指数递增) *******\n");
printf("********** 3.显示单链表整体 *******\n");
printf("********** 4.求单链表长度 *******\n");
printf("********** 5.判断单链表是否为空 *******\n");
printf("********** 6.求一元多项式的和 *******\n");
printf("********** 0.退出 *******\n");
printf("*********************************************************\n");
while (choose != 0) {
printf("请输入你的选择项:");
scanf("%d", &choose);
// 在switch外部声明变量
PNode *temp;
switch (choose) {
case 1:
chushihua(&head[0], &head[1], &head[2]);
printf("链表已经初始化。\n");
break;
case 2:
for (i = 0; i < 2; i++) {
printf("创建的第%d个一元多项式\n", i+1);
charu_1(head[i]);
}
break;
case 3:
printf("显示第1个链表");
xianshi(head[0]);
printf("显示第2个链表");
xianshi(head[1]);
break;
case 4:
printf("计算第1个链表的长度");
Length(head[0]);
printf("计算第2个链表的长度");
Length(head[1]);
break;
case 5:
printf("判断第1个链表是否为空");
Emp(head[0]);
printf("判断第2个链表是否为空");
Emp(head[1]);
break;
case 6:
// 先清空结果链表
clearList(head[2]);
hebiao(head[0], head[1], head[2]);
break;
case 0:
printf("程序退出,感谢使用!\n");
// 释放内存
for (i = 0; i < 3; i++) {
clearList(head[i]);
free(head[i]);
}
return 0;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}