【问题描述】
设计算法用顺序表实现两个多项式相加。
【数据描述】
定义一个结构体来存储每一项
typedefstruct one {
intdata;
intindex;
}enode;
定义一个顺序表来存储多项式
typedefstruct qList {
enode*data;
structqList *next;
}L;
【算法描述】
输入多项式
voidinput(L *list)
{
intin, mi;
intcount = 0;
list->next= (L*)malloc(sizeof(L));//为下一项申请空间的时候失败
if(!list->next)
{
printf("申请空间失败2");
return;
}
L*pt = list->next;//指向除头节点的第一项
//构造一个死循环来进行输入,一旦发现输入的系数为0就会停止
while(1)
{
pt->data= (enode*)malloc(sizeof(enode));
if(!(pt->data))
{
printf("申请空间失败3");//为每一项中的enode格式的数据结构申请空间的时候失败
return;
}
printf("请输入第%d项的系数",++count);
scanf_s("%d",&in);
//一旦发现输入的系数为0那么久停止输入
if(in == 0)
{
pt->data->data= 0;
return;
}
printf("请输入第%d项的指数",count);
scanf_s("%d",&mi);
pt->data->data= in;
pt->data->index= mi;
//printf("testvalue%d",list->data->data);
pt->next= (L*)malloc(sizeof(L));
if(!pt->next)
{
printf("申请空间失败2");//为下一项申请空间失败
return;
}
pt= pt->next;
}
}
voidadd(L* list1, L*list2)
{
//让每一个多项式指向第一项
L*pt1 = list1->next;
L*pt2 = list2->next;
L*temp1,*temp2;
L*pre= list1;
while(pt1->data->data != 0 && pt2->data->data != 0)
{
if(pt1->data->index>pt2->data->index)//如果第一个多项式的指数大于第二个就把第二个多项式中的此项插入到第一个多项式的前面
{
pre->next= pt2;
temp2= pt2->next;
pt2->next= pt1;
pt2= temp2;
pre= pre->next;
}
elseif (pt1->data->index ==pt2->data->index)//如果相等就相加存到第一个多项式中,并且把第二个多项式中这一项释放指针后移。
{
pt1->data->data+= pt2->data->data;
temp1= pt2;
pt1= pt1->next;
pre= pre->next;
pt2= pt2->next;
free(temp1);
}
elseif(pt1->data->index<pt2->data->index)//如果第一个多项式中的指数小于第二个多项式中的值就把第一个多项式中的指针向后移动
{
pt1= pt1->next;
pre= pre->next;
}
}
if(pt2->data->data != 0)
{
pt1->data->data= pt2->data->data;
pt1->data->index= pt2->data->index;
pt1->next= pt2->next;
}
}
//附上程序全部 vs中编译vc6.0可能会有语法错误,改正一下就可以
#include<stdio.h>
#include<stdlib.h>
typedef struct one {
int data;
int index;
}enode;
typedef struct qList {
enode *data;
struct qList *next;
}L;
L* initList()
{
L *list = (L*)malloc(sizeof(L));
if (!list)
{
printf("空间申请失败1");
return NULL;
}
return list;
}
void input(L *list)
{
int in, mi;
int count = 0;
list->next = (L*)malloc(sizeof(L));//为下一项申请空间的时候失败
if (!list->next)
{
printf("申请空间失败2");
return;
}
L *pt = list->next;//指向除头节点的第一项
//构造一个死循环来进行输入,一旦发现输入的系数为0就会停止
while (1)
{
pt->data = (enode*)malloc(sizeof(enode));
if (!(pt->data))
{
printf("申请空间失败3");//为每一项中的enode格式的数据结构申请空间的时候失败
return;
}
printf("请输入第%d项的系数", ++count);
scanf_s("%d", &in);
//一旦发现输入的系数为0那么久停止输入
if (in == 0)
{
pt->data->data = 0;
return;
}
printf("请输入第%d项的指数", count);
scanf_s("%d", &mi);
pt->data->data = in;
pt->data->index = mi;
//printf("test value%d",list->data->data);
pt->next = (L*)malloc(sizeof(L));
if (!pt->next)
{
printf("申请空间失败2");//为下一项申请空间失败
return;
}
pt = pt->next;
}
}
void add(L* list1, L*list2)
{
//让每一个多项式指向第一项
L *pt1 = list1->next;
L *pt2 = list2->next;
L*temp1, *temp2;
L*pre = list1;
while (pt1->data->data != 0 && pt2->data->data != 0)
{
if (pt1->data->index>pt2->data->index)//如果第一个多项式的指数大于第二个就把第二个多项式中的此项插入到第一个多项式的前面
{
pre->next = pt2;
temp2 = pt2->next;
pt2->next = pt1;
pt2 = temp2;
pre = pre->next;
}
else if (pt1->data->index == pt2->data->index)//如果相等就相加存到第一个多项式中,并且把第二个多项式中这一项释放指针后移。
{
pt1->data->data += pt2->data->data;
temp1 = pt2;
pt1 = pt1->next;
pre = pre->next;
pt2 = pt2->next;
free(temp1);
}
else if (pt1->data->index<pt2->data->index)//如果第一个多项式中的指数小于第二个多项式中的值就把第一个多项式中的指针向后移动
{
pt1 = pt1->next;
pre = pre->next;
}
}
if (pt2->data->data != 0)
{
pt1->data->data = pt2->data->data;
pt1->data->index = pt2->data->index;
pt1->next = pt2->next;
}
}
void out(L*list)
{
L*pt = list->next;
while (pt->data->data != 0)
{
printf("%d,%d\t", pt->data->data, pt->data->index);
pt = pt->next;
}
}
int main()
{
L* list1 = initList();
L*list2 = initList();
input(list1);
input(list2);
//printf("即将输出");
add(list1, list2);
out(list1);
}