多项式相加
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
float coef; //系数
int expo; //指数
struct LNode * next;
}LNode;
typedef struct LNode* LinkList;
void CreateList_L(LinkList &L);
void InitList_L(LinkList &L);
void CreateList_L(LinkList &L)//这是一个具有头结点的链表
{
L = (LinkList)malloc(sizeof(LNode)); //首先创建一个头结点
LinkList p = L; //用遍历指针先指向头结点
p->next = (LinkList)malloc(sizeof(LNode));
p = p->next;
int size; //定义多项式长度
printf("请输入多项式的长度:");
scanf("%d", &size);
if (size>0)
{
for (int i = 1; i<size; i++)
{
p->next = (LinkList)malloc(sizeof(LNode));
p = p->next;
}
p->next = NULL;
}
else
{
printf("链表的长度必须大于0\n");
}
}
void InitList_L(LinkList &L)//初始化链表
{
if (L->next != NULL)
{
LinkList p = L->next;
while (p != NULL)
{
printf("请输入系数,指数:");
scanf("%f,%d", &p->coef,&p->expo);
p = p->next;
}
}
else
{
printf("链表为空,无法初始化\n");
}
}
void MergeList_L(LinkList &La,LinkList &Lb)
{
LinkList p = La;
LinkList headB = Lb;
for(;p->next!=NULL;p=p->next);
p->next =headB;
}
void ListSort(LinkList &L)
{
LinkList p,q;
if (L->next != NULL)
{
q = p = L->next;
int temp;
float temp1;
while (q->next != NULL)
{
while (p->next != NULL)
{
p = p->next;
if (q->expo > p->expo)
{
temp = q->expo;
q->expo =p->expo;
p->expo = temp;
temp1 = q->coef;
q->coef = p->coef;
p->coef = temp1;
}
}
q = q->next;
p = q;
}
}
else
{
printf("链表为空,无法排序");
}
}
void addPolyn_L(LinkList &La,LinkList &Lb)
{ //La,Lb为两个含头结点的多项式链表
LinkList r,p,q,s,head;
p = La->next;
q = Lb->next;
head = La;
while(q!=NULL)
{
int flag = 0;
p = La->next;
while (p!=NULL)
{
if (p->expo==q->expo)
{
flag = 1;
s = p;
}
p = p->next;
}
if(flag==1)
{
s->coef = s->coef + q->coef;
}
else
{
r = (LinkList)malloc(sizeof(LNode));
r->coef = q->coef;
r->expo = q->expo;
r->next = head->next;
head->next = r;
}
q = q->next;
}
ListSort(La) ;
}
int ListLength(LinkList L)
{
int List_Length = 0;
LinkList p;
if (L->next != NULL)
{
p = L->next;
while (p != NULL)
{
if (p->coef != 0) {
List_Length++;
} //系数不等于0 长度+1
p = p->next;
}
}
else
{
printf("链表为空,长度为0");
}
return List_Length;
}
void Display(LinkList L)
{
if (L->next != NULL)
{
LinkList p;
int List_Length;
List_Length = ListLength(L);//得到多项式的长度
printf("F=");
p = L->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->expo);
}
else {
printf("%2.2fX^%d", p->coef, p->expo);
}
if (p->next != NULL) {
printf("+");
} //是最后一个的话就不输出+
p = p->next;
}
printf("\n");
}
else
{
printf("链表为空,无法展示\n");
}
printf("\n");
}
int main()
{
LinkList La,Lb; //定义两个能分别放下目标多项式的链表
CreateList_L(La); //创造一个指定长度的链表,没有内容
InitList_L(La); //初始化链表,装入内容
CreateList_L(Lb);
InitList_L(Lb);
addPolyn_L(La,Lb); //多项式相加,并引用La的头结点
Display(La); //打印出多项式
}