多项式的每一项用一个结构体存储 在这里主要介绍两种方法实现加减法 (有什么建议想法 评论哦)
第一种方法是将f2多项式中的每一项分别和f1中的每一项比对 如果f1中有和f2当前一项指数相同的项 将系数相加 如果没有 将这一项插入到f1的最前面 继续判断f2的下一项
void addPolyn(Test *f1,Test *f2) { //f1 f2为两个多项式链表 含头结点
head = f1;p = f1->next; q = f2->next;
while (q!=NULL) {
p = f1->next; //每次都将指针指向A的第一项
int flag = 0; //B多项式每后移一项都赋flag为0
while (p!=NULL){
if (p->expn==q->expn) {
flag = 1; //做为后面是插入还是系数相加的判断条件
s = p; //多项式A里面要是有与当前多项是B中的一个指数相同的话 用s保存下来
}
p = p->next;
}
if (flag == 1) { //如果A中存在与B中当前一项系数相同的项
s->coef = s->coef + q->coef; //将相同系数的项指数相加
}
else { //如果不存在
r = (Test *)malloc(length); //将当前项复制到一块新的结构体中
r->coef = q->coef;
r->expn = q->expn;
r->next = head->next; //将B当前项插入A中
head->next = r;
}
q = q->next; //进行B的下一项的判断
}
ListSort(f1);//输入随机 有序无序都可以
}
第二种方法是先将两个多项式合并 然后排序 将指数相同的项的系数相加至它的前一项 然后跳过该节点 (本来想将无序链表直接实现删除多余项 但是出了点bug 暂时不好解决^-^)
void addPolyn1(Test *f1, Test *f2) {
head = mergeList(f1, f2); //连接链表
ListSort(head); //从小到大排序
p = head->next; //从头结点后的项开始
q = p;
while (p->next!=NULL) {
q = p; //每一次都是两个挨着的项进行判断
if (p->expn==q->next->expn) { //如果该项和后一项指数值相等
p->coef = p->coef + q->next->coef; //系数相加
r = q->next; //用一个指针指向后面的一项
p->next = r->next; //跨过后面的一项
}
else {
p = p->next; //如果该项和后面一项指数不相等 将指针后移一位 继续判断
}
}
}
减法和加法的思路一样 先将后一个链表的系数全变为负的 在进行相加
void subPolyn(Test *f1,Test *f2) {
p = f1->next; q = f2->next;
while (q!= NULL) { //将B中的每一项的系数变为负的
q->coef=-q->coef;
q = q->next;
}
addPolyn(f1, f2); //再进行相加
}
void subPolyn1(Test *f1,Test *f2) {
p = f1->next; q = f2->next;
while (q != NULL) { //将B中的每一项的系数变为负的
q->coef = -q->coef;
q = q->next;
}
addPolyn1(f1, f2);
}
最后附上整段代码
// 稀疏多项式加减.cpp: 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<stdlib.h>
#define length sizeof(struct node)
typedef struct node
{
float coef; //系数
int expn; //指数
struct node *next;
} Test;
Test *head, *p, *q, *r,*s;//定义遍历指针
//带有头结点的链表
Test *Create()//这是一个具有头结点的链表
{
int List_Size;
head = (Test *)malloc(length); //首先创建一个头结点
p = head; //用遍历指针先指向头结点
p->next = (Test *)malloc(length);
p = p->next;
printf("请输入多项式的长度:");
scanf("%d", &List_Size);
if (List_Size>0)
{
for (int i = 1; i<List_Size; i++)
{
p->next = (Test *)malloc(length);
p = p->next;
}
p->next = NULL;
return head;
}
else
{
printf("链表的长度必须大于0\n");
}
return head;
}
void InitList(Test *List_Head)//初始化链表
{
if (List_Head->next != NULL)
{
p = List_Head->next;
while (p != NULL)
{
printf("请输入系数,指数:");
scanf("%f,%d", &p->coef,&p->expn);
p = p->next;
}
}
else
{
printf("链表为空,无法初始化\n");
}
}
int ListLength(Test *List_Head)
{
int List_Length = 0;
if (List_Head->next != NULL)
{
p = List_Head->next;
while (p != NULL)
{
if (p->coef != 0) {
List_Length++;
} //系数不等于0 长度+1
p = p->next;
}
}
else
{
printf("链表为空,长度为0");
}
return List_Length;
}
void ListSort(Test *List_Head)//排序 由小到大
{
if (List_Head->next != NULL)
{
q = p = List_Head->next;//指向头结点后的第一个结点
int temp; float temp1;
while (q->next != NULL)
{
while (p->next != NULL)
{
p = p->next;
if (q->expn > p->expn)
{
temp = q->expn;
q->expn = p->expn;
p->expn = temp; //交换系数
temp1 = q->coef;
q->coef = p->coef;
p->coef = temp1; //交换指数
}
}//循环一次 最小的被交换到前面
q = q->next;//指针向后推一个 继续排后面的
p = q;
}
}
else
{
printf("链表为空,无法排序");
}
}
void Display(Test *List_Head)
{
if (List_Head->next != NULL)
{
int List_Length;
List_Length = ListLength(List_Head);//得到多项式的长度
printf("F=");
p = List_Head->next;
while (p != NULL)
{
if (List_Length == 0) { //如果多项式长度为零 输出0 跳出循环
printf("0");
break;
}
if (p->coef == 0) {
p = p->next;
continue;
} //如果系数为0不输出 跳到下一个
if (p->coef<0) {
printf("(%2.2fX^%d)", p->coef, p->expn);
}
else {
printf("%2.2fX^%d", p->coef, p->expn);
}
if (p->next != NULL) {
printf("+");
} //是最后一个的话就不输出+
p = p->next;
}
printf("\n");
}
else
{
printf("链表为空,无法展示\n");
}
printf("\n");
}
Test *mergeList(Test *f1, Test *f2) {
p = f1->next; q = f2->next;
while (p->next!= NULL) {
p = p->next;
}
p->next = q;
head = f1;
return head;
}
void addPolyn(Test *f1,Test *f2) {
head = f1;p = f1->next; q = f2->next;
while (q!=NULL) {
p = f1->next; //每次都将指针指向A的第一项
int flag = 0; //B多项式每后移一项都赋flag为0
while (p!=NULL){
if (p->expn==q->expn) {
flag = 1; //做为后面是插入还是系数相加的判断条件
s = p; //多项式A里面要是有与当前多项是B中的一个指数相同的话 用s保存下来
}
p = p->next;
}
if (flag == 1) { //如果A中存在与B中当前一项系数相同的项
s->coef = s->coef + q->coef; //将相同系数的项指数相加
}
else { //如果不存在
r = (Test *)malloc(length); //将当前项复制到一块新的结构体中
r->coef = q->coef;
r->expn = q->expn;
r->next = head->next; //将B当前项插入A中
head->next = r;
}
q = q->next; //进行B的下一项的判断
}
ListSort(f1);//输入随机 有序无序都可以
}
void addPolyn1(Test *f1, Test *f2) {
head = mergeList(f1, f2); //连接链表
ListSort(head); //从小到大排序
p = head->next; //从头结点后的项开始
q = p;
while (p->next!=NULL) {
q = p; //每一次都是两个挨着的项进行判断
if (p->expn==q->next->expn) { //如果该项和后一项指数值相等
p->coef = p->coef + q->next->coef; //系数相加
r = q->next; //用一个指针指向后面的一项
p->next = r->next; //跨过后面的一项
}
else {
p = p->next; //如果该项和后面一项指数不相等 将指针后移一位 继续判断
}
}
}
void subPolyn(Test *f1,Test *f2) {
p = f1->next; q = f2->next;
while (q!= NULL) { //将B中的每一项的系数变为负的
q->coef=-q->coef;
q = q->next;
}
addPolyn(f1, f2); //再进行相加
}
void subPolyn1(Test *f1,Test *f2) {
p = f1->next; q = f2->next;
while (q != NULL) { //将B中的每一项的系数变为负的
q->coef = -q->coef;
q = q->next;
}
addPolyn1(f1, f2);
}
int main()
{
Test *List_A, *List_B;
List_A = Create();
InitList(List_A);
Display(List_A);
List_B = Create();
InitList(List_B);
Display(List_B);
addPolyn(List_A,List_B);
//addPolyn1(List_A, List_B);
//subPolyn(List_A, List_B);
//subPolyn1(List_A, List_B);
Display(List_A);
}