这是大二刚开始数据结构的平时作业,上次随便发了,没来得及写标题和内容。题目要求用链表来实现多项式的加减,其实就是设置一个两个指针进行遍历,在代码段里有一些注解,要是有不太清楚的地方可以在下面留言或是私信我
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct polynmial
{
float coef; //系数
int exp; //指数
struct polynmial *next; //指针
} Node, *LinkList;
Status Initpolyn(Node *L) //初始化链表
{
L = (LinkList)malloc(sizeof(Node));
if (!L) //若空间申请失败则返回0退出
return ERROR;
L->next = NULL; //指针初始化
return OK;
}
Status Createpolyn(Node *L) //设置多项式
{
int num, i;
LinkList p;
printf("请输入一元多项式的个数:\n");
scanf("%d", &num);
printf("请输入一元多项式的系数和指数(例:2*x^3输入为2,3):\n");
p = L;
for (i=0; i<num; ++i) //输入一项则申请一个空间进行储存
{
p->next = (LinkList)malloc(sizeof(Node));
p = p->next;
scanf("%f,%d", &p->coef, &p->exp);
}
p->next = NULL; //尾项指针赋值为空
return TRUE;
}
void Display(Node *L) //输出多项式内容
{
LinkList p;
p = L->next;
printf("该多项式为:\n");
while (p != NULL) //若该项地址不为空,则遍历输出该多项式的内容
{
printf("%.2f x^%d | ", p->coef, p->exp);
p = p->next;
}
}
void Addpolyn(Node *La, Node *Lb, Node *Lc, int n) //对多项式进行加减操作
{
float sum;
LinkList pa, pb, pc;
pc = (LinkList)malloc(sizeof(Node)); //对实表进行初始化
pc->next = NULL;
pc = Lc; //利用一个实参储存新表的首结点
pa = La->next;
pb = Lb->next;
while (pa && pb) //若两个表不为空,则循环对比
{
if (pa->exp == pb->exp) //若两项相等,则判断加或减运算,再对系数进行运算
{
if (n == 1)
{
sum = pa->coef + pb->coef;
}
else if (n == 0)
{
sum = pa->coef - pb->coef;
}
if (sum) //若系数不为0,则把运算后的系数和表A的指数存入新表中作为一项
{
pc->next = (LinkList)malloc(sizeof(Node));
pc = pc->next;
pc->coef = sum;
pc->exp = pa->exp;
}
pa = pa->next;
pb = pb->next;
}
else //若两项不相等,则将系数小的一项存入新表中,然后遍历到下一项,循环判断直到一个表结束
{
pc->next = (LinkList)malloc(sizeof(Node));
pc = pc->next;
if (pa->exp < pb->exp)
{
pc->coef = pa->coef;
pc->exp = pa->exp;
pa = pa->next;
}
else if (pa->exp > pb->exp)
{
pc->coef = pb->coef;
pc->exp = pb->exp;
pb = pb->next;
}
}
}
while (pa) //若表A未结束,则将剩下的项均存入新表中
{
pc->next = (LinkList)malloc(sizeof(Node));
pc = pc->next;
pc->coef = pa->coef;
pc->exp = pa->exp;
pa = pa->next;
}
while (pb) //若表B未结束,则将剩下的项均存入新表中
{
pc->next = (LinkList)malloc(sizeof(Node));
pc = pc->next;
pc->coef = pb->coef;
pc->exp = pb->exp;
pb = pb->next;
}
pc->next = NULL;
}
double GetRe(Node *Lc) //计算多项式的值
{
LinkList p = NULL;
int name;
double x, sum_poly = 0;
scanf("%lf", &x);
p = Lc->next;
while (p) //若该表地址非空,则遍历每一项进行运算
{
sum_poly += (double)p->coef * (double)(pow(x,p->exp));
p = p->next;
}
return sum_poly;
}
int main()
{
Node La, Lb, Lc;
int change;
double result;
Initpolyn(&La); //创建表A,B
Initpolyn(&Lb);
Createpolyn(&La); //创建多项式A,B
Display(&La);
Createpolyn(&Lb);
Display(&Lb);
printf("若输入1则对多项式进行加操作,输入0则对多项式进行减操作:");
scanf("%d", &change);
Addpolyn(&La, &Lb, &Lc, change);
Display(&Lc);
printf("请输入x的值:\n");
result = GetRe(&Lc);
printf("%.2lf\n", result);
return 0;
}