嗯嗯先上代码
#include <stdio.h>
#include <stdlib.h>
typedef struct data
{
int coefficient;
int index;
}data;
typedef struct Sqlist
{
int length;
data *elem;
}Sqlist;
//链表初始化
void Init_List(Sqlist *p,int i)
{
p->elem=(data *)malloc(sizeof(data)*i);
if(p->elem==NULL)
{
printf("申请空间失败");
}
printf("请输入%d个系数值\n",i);
for(int j=0;j<i;j++)
{
scanf("%d",&p->elem[j].coefficient);
}
printf("请输入%d个指数值\n",i);
for(int j=0;j<i;j++)
{
scanf("%d",&p->elem[j].index);
}
p->length=i;
}
//销毁线性表
void Destroy_List(Sqlist *p)
{
if(p->elem)
{
free(p->elem);
}
printf("该线性表已经摧毁\n");
}
//打印数据函数
void Printf_List(Sqlist *p)
{
printf("该表的数据为:\n");
printf("系数:\n");
for(int j=0;j<p->length;j++)
{
printf("%d\t",p->elem[j].coefficient);
}
printf("\n");
printf("指数:\n");
for(int j=0;j<p->length;j++)
{
printf("%d\t",p->elem[j].index);
}
printf("该表打印完成\n");
}
//稀疏多项式相加
void Sparse_polynomialList(Sqlist *LA,Sqlist *LB,Sqlist *LC)
{
int pa=0,pb=0,pc=0;
LC->length=LA->length+LB->length;
LC->elem=(data *)malloc(sizeof(data)*LC->length);
while(pa<=LA->length-1&&pb<=LB->length-1)
{
if(LA->elem[pa].index<LB->elem[pb].index)
{
LC->elem[pc].coefficient=LA->elem[pa].coefficient;
LC->elem[pc].index=LA->elem[pa].index;
pc++;
pa++;
}
if(LA->elem[pa].index=LB->elem[pb].index)
{
if(LA->elem[pa].coefficient+LB->elem[pb].coefficient==0)
{
pa++;
pb++;
}
else
{
LC->elem[pc].coefficient=LA->elem[pa].coefficient+LB->elem[pb].coefficient;
LC->elem[pc].index=LA->elem[pa].index;
pc++;
pa++;
pb++;
}
}
if(LA->elem[pa].index>LB->elem[pb].index)
{
LC->elem[pc].coefficient=LB->elem[pb].coefficient;
LC->elem[pc].index=LB->elem[pb].index;
pc++;
pb++;
}
}
while(pa<=LA->length-1)
{
LC->elem[pc].coefficient=LA->elem[pa].coefficient;
LC->elem[pc].index=LA->elem[pa].index;
pc++;
pa++;
}
while(pb<=LB->length-1)
{
LC->elem[pc].coefficient=LB->elem[pb].coefficient;
LC->elem[pc].index=LB->elem[pb].index;
pc++;
pb++;
}
while(pc<=LC->length-1)
{
LC->elem[pc].coefficient=0;
LC->elem[pc].index=0;
pc++;
}
printf("稀疏多项式相加完成\n");
}
int main()
{ Sqlist pa,pb,pc;
Sqlist *LA=&pa,*LB=&pb,*LC=&pc;
Init_List(LA,4);
Init_List(LB,3);
Printf_List(LA);
printf("-----------------------------\n");
Printf_List(LB);
printf("-----------------------------\n");
Sparse_polynomialList(LA,LB,LC);
Printf_List(LC);
printf("-----------------------------\n");
Destroy_List(LA);
Destroy_List(LB);
Destroy_List(LC);
}
稀疏多项式是多项式算法的延申,只存了该存的数。因为普通多项式是按照顺序,而稀疏多项式算法是为了节约空间而设置的。
稀疏多项式算法
void Sparse_polynomialList(Sqlist *LA,Sqlist *LB,Sqlist *LC)
{
int pa=0,pb=0,pc=0;
LC->length=LA->length+LB->length;
LC->elem=(data *)malloc(sizeof(data)*LC->length);
while(pa<=LA->length-1&&pb<=LB->length-1)
{
if(LA->elem[pa].index<LB->elem[pb].index)
{
LC->elem[pc].coefficient=LA->elem[pa].coefficient;
LC->elem[pc].index=LA->elem[pa].index;
pc++;
pa++;
}
if(LA->elem[pa].index=LB->elem[pb].index)
{
if(LA->elem[pa].coefficient+LB->elem[pb].coefficient==0)
{
pa++;
pb++;
}
else
{
LC->elem[pc].coefficient=LA->elem[pa].coefficient+LB->elem[pb].coefficient;
LC->elem[pc].index=LA->elem[pa].index;
pc++;
pa++;
pb++;
}
}
if(LA->elem[pa].index>LB->elem[pb].index)
{
LC->elem[pc].coefficient=LB->elem[pb].coefficient;
LC->elem[pc].index=LB->elem[pb].index;
pc++;
pb++;
}
}
while(pa<=LA->length-1)
{
LC->elem[pc].coefficient=LA->elem[pa].coefficient;
LC->elem[pc].index=LA->elem[pa].index;
pc++;
pa++;
}
while(pb<=LB->length-1)
{
LC->elem[pc].coefficient=LB->elem[pb].coefficient;
LC->elem[pc].index=LB->elem[pb].index;
pc++;
pb++;
}
while(pc<=LC->length-1)
{
LC->elem[pc].coefficient=0;
LC->elem[pc].index=0;
pc++;
}
printf("稀疏多项式相加完成\n");
}
下面我会详细介绍这段代码
这里上面传进来三个线性表,同时我们将为LC申请空间,这个线性表存稀疏多项式相加的结果。相信大家对malloc已经很熟悉了。
这里面的while就是遍历两个表,因为我们需要比较指数,如果pa的指数比较小我们就将pa的指数和系数都存在pc里,同时改变pc和pa的值,如果pb比较小的话也是如此。
主要是相等的情况如果系数相等我们需要判断系数相加是否为0,不为0就可以直接存在pc中同时pa++ pc++ pa++,为0就得跳过这个数据也就是pa++;pb++
pa指数如果大于pb指数,处理方法跟pa指数小于pb指数类似。当我们将一个表遍历完之后我们就将没完的表的数据接在pc后面即可也就是下面几段代码。
希望对大家有帮助。