#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Lnode{
int data1;//系数
int data2;//指数
struct Lnode*next;
}Lnode,*LinkList;
/*创建链表*/
LinkList InitLinkList(){
LinkList L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL;
return L;
}
/*销毁链表*/
void DestroyList(LinkList L){
LinkList p;
while(L){
p=L;
L=L->next;
free(p);
}
}
/*输入多项式的系数和指针(尾插法)*/
void Insertdata(LinkList L){
int x,y,z,i;
LinkList H;
LinkList p;
LinkList q;
p=L;
printf("请输入要输入的数据个数\n");
scanf("%d",&z);
printf("请输入要输入的系数和指数\n");//输入的指数必须是顺序的
for(i=0;i<z;i++){
H=(LinkList)malloc(sizeof(Lnode));
p->next=H;
scanf("%d%d",&x,&y);
H->data1=x;
H->data2=y;
H->next=NULL;
p=H;
}
}
/*打印多项式的系数和指数*/
void printfList(LinkList L){
LinkList p;
p=L->next;
while(p){
printf("[%d][%d]\t",p->data1,p->data2);
p=p->next;
}
printf("\n");
}
/*合并两个表的多项式系数*/
void MergeList(LinkList L,LinkList H){
LinkList Pa,Pb,p,q,k,j,m;
Pa=L;//新链表尾指针
Pb=H;
p=L->next;
q=H->next;
free(Pb);
while(p&&q){
if(p->data2<q->data2){
Pa->next=p;
Pa=p;//改变尾指针
p=p->next;//指向下一个数据
}
else if(p->data2>q->data2){
Pa->next=q;
Pa=q;
q=q->next;
}
else if(p->data2==q->data2){
p->data1=p->data1+q->data1;//将相加的系数先存在L表
if(p->data1==0){//判断系数是否互为相反数
//记录当前指针
k=p;
j=q;
//跳到下一个结点
p=p->next;
q=q->next;
//释放系数互为相反数的结点
free(k);
free(j);
}
else{
//如果不互为相反数
Pa->next=p;
Pa=p;
m=q;//释放多余结点
//都跳转到下一节点
q=q->next;
p=p->next;
free(m);
}
}
}
if(q){
Pa->next=q;
}
if(p){
Pa->next=p;
}
}
/*多项式运算*/
void AddingPolynomials(LinkList L){
int sum,i,x;
LinkList q;
q=L->next;
sum=0;
printf("请输入底数的值\n");
scanf("%d",&x);
while(q){
sum=sum+q->data1*pow(x,q->data2);//有指数为0的
q=q->next;
}
printf("多项式结果为:%d",sum);
}
int main(int argc, char *argv[]) {
LinkList L,H;
L=InitLinkList();
H=InitLinkList(H);
Insertdata(L);
printfList(L);
Insertdata(H);
printfList(H);
printf("合并线性表后的内容:\n");
MergeList(L,H);
printfList(L);
AddingPolynomials(L);
DestroyList(L);
//DestroyList(H);
return 0;
}
稀疏多项式链表实现
最新推荐文章于 2024-07-24 15:28:00 发布