Files
Course/DataStructure/test2/实验二.cpp
2025-11-07 18:39:29 +08:00

234 lines
5.5 KiB
C++
Raw Permalink 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
L = (Polynomial)malloc(sizeof(PNode));
M = (Polynomial)malloc(sizeof(PNode));
N = (Polynomial)malloc(sizeof(PNode));
L->next = NULL;
M->next = NULL;
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 //while循环不断往后移动p指针并让length++
p = L;
while (p->next != NULL)
{
p = p->next;
length++;
}
printf("链表长度为:%d\n", length);
}
// 1、构造两个按指数递增的有序链表插入节点创建一元多项式
void charu_1(Polynomial &L)
{
PNode *q, *p;
int n;
printf("请输入你要创建的一元多项式的项数:\n");
scanf("%d", &n);
for (int 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 p指针移动到最后一个结点位置
p = p->next;
}
// todo list 将*q结点插入到*p结点后
q->next = p->next;
p->next = q;
}
}
void xianshi(Polynomial &L)
{
PNode *p;
p = L;
while (p->next != NULL)
{
printf("%4d", p->next->coe); // 系数
printf("H");
printf("%d", p->next->index); // 指数
p = p->next;
}
}
// 2、两个一元多项式相加
void hebiao(Polynomial &J, Polynomial &O, Polynomial &H)
{
PNode *p = J->next, *q = O->next, *r = H, *s; // r是尾指针
while (p != NULL && q != NULL)
{
if (p->index < q->index)
{
s = (Polynomial)malloc(sizeof(PNode));
// todo list //保存p指向结点的系数和指数到s所指向结点中的系数和指数中
s->coe = p->coe;
s->index = p->index;
// todo list //插入s所指向结点到r所指向结点的后面
s->next = NULL;
r->next = s;
r = s; // 更新尾指针
p = p->next; // 更新p指针
}
else if (p->index > q->index)
{
s = (Polynomial)malloc(sizeof(PNode));
// todo list //保存q指向结点的系数和指数到s所指向结点中的系数和指数中
s->coe = q->coe;
s->index = q->index;
// todo list //插入s所指向结点到r所指向结点的后面
s->next = NULL;
r->next = s;
r = s; // 更新尾指针
q = q->next; // 更新q指针
}
else
{ // 指数相等的情况
int sum = p->coe + q->coe;
if (sum != 0)
{
s = (Polynomial)malloc(sizeof(PNode));
// todo list //保存p指向结点的指数到s所指向结点中的指数中
s->index = p->index;
// todo list //保存sum到s所指向结点中的系数中
s->coe = sum;
// todo list //插入s所指向结点到r所指向结点的后面
s->next = NULL;
r->next = s;
r = s; // 更新尾指针
}
p = p->next; // 更新p指针
q = q->next; // 更新q指针
}
}
while (p != NULL)
{ // J链表非空还剩余有元素把其剩余的元素插入到合表H链表后面
s = (Polynomial)malloc(sizeof(PNode));
// todo list 尾插
s->coe = p->coe;
s->index = p->index;
s->next = NULL;
r->next = s;
r = s;
p = p->next; // 更新p指针
}
while (q != NULL)
{ // O链表非空还剩余有元素把其剩余的元素插入到合表H链表后面
s = (Polynomial)malloc(sizeof(PNode));
// todo list 尾插
s->coe = q->coe;
s->index = q->index;
s->next = NULL;
r->next = s;
r = s;
q = q->next; // 更新q指针
}
xianshi(H); // 新增
}
int main()
{
Polynomial head[3];
int i;
for (i = 0; i < 3; i++)
{
head[i] = (Polynomial)malloc(sizeof(PNode)); // head[0]表示第一个一元多项式链表head[1]为第二个一元多项式链表
}
int choose = -1, n;
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)
{
printf("请输入你的选择项:\n");
scanf("%d", &choose);
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]); // 显示第1个链表
printf("\n");
printf("显示第2个链表");
xianshi(head[1]); // 显示第2个链表
printf("\n");
// xianshi(head[2]); // 显示第3个链表
// printf("\n");
break;
case 4:
printf("计算第1个链表的长度");
Length(head[0]); // 计算 第1个链表的长度
printf("计算第2个链表的长度");
Length(head[1]); // 计算 第2个链表的长度
// Length(head[2]); //计算 第3个链表的长度
break;
case 5:
printf("判断第1个链表是否为空");
Emp(head[0]); // 判断第1个链表是否为空
printf("判断第2个链表是否为空");
Emp(head[1]); // 判断第2个链表是否为空
// Emp(head[2]); // 判断第3个链表是否为空
break;
case 6:
hebiao(head[0], head[1], head[2]);
break;
case 0:
exit(0);
break;
}
}
return 0; // 程序正常退出时返回0
}