今天学习了用链表实现多项式的加减运算
实现的思路是这样的
(1)观察两个多项式 ,找出最高项的系数 ,这是为了确定在链表中确定存放多少个数据的关键。比如多项式最高项的系数为4,那么这个链表中就要存放五个数据。
(2)观察其他项的系数,如果多项式X^3的系数为零,那么在链表中的该节点就存放零。如果该多项式有常数,链表的最后就存放该常数。
(3)采用头插法将多项式的系数存放在链表中。依次存放最高项系数 ,直至改多项式的常数项。
(4)将连个链表对应位置的系数依次相加。即可求出相加后的多项式。
具体的实现代码如下所示(仅供参考)
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *next;
}Node;
typedef struct nodectrl
{
Node *head;
int num;
}NodeCtrl;
NodeCtrl *CreateCtrl()
{
NodeCtrl *nc = (NodeCtrl*)malloc(sizeof(NodeCtrl));
if(nc == NULL)
{
puts("Create NodeCtrl failed!");
return NULL;
}
nc->head = NULL;
nc->num = 0;
return nc;
}
int AddData(NodeCtrl *nc,int data)
{
Node *p = NULL;
Node *q = NULL;
if(nc == NULL)
return -1;
q = (Node*)malloc(sizeof(Node));
if(q == NULL)
return -1;
q->data = data;
q->next = NULL;
p = nc->head;
if(p != NULL)
q->next = nc->head;
nc->head = q;
nc->num++;
return 0;
}
int DeleteData(NodeCtrl *nc, int data)
{
Node *q,*p;
int success = 0;
if(nc == NULL || nc->head == NULL)
return success;
if(nc->head->data == data)
{
p = nc->head;
nc->head = p->next;
success = 1;
free(p);
}
else
{
p = nc->head;
q = p->next;
while(q != NULL)
{
if(q->data == data)
{
p->next = q->next;
success = 1;
free(q);
break;
}
p = q;
q = q->next;
}
}
if(success)
nc->num--;
return success;
}
void Display(NodeCtrl *nc)
{
Node *p = NULL;
if(nc == NULL)
return ;
printf("f(x)=");
if(nc->num > 0)
{
int i=0;
p = nc->head;
while(p != NULL)
{
if( i == nc->num-1)
printf("%dx^%d",p->data,i);
else
printf("%dx^%d+",p->data,i);
p = p->next;
i++;
}
}
}
void Display2(NodeCtrl *nc1,NodeCtrl *nc2, NodeCtrl * nc3)
{
Node *p = NULL;
Node *q =NULL;
int a[5],i;
if(nc1 == NULL || nc2 == NULL )
return ;
if(nc1->num > 0)
{
p = nc1->head;
q=nc2->head;
while(p != NULL)
{
a[i] = p->data + q->data ;
p = p->next;
q = q->next;
i++;
}
}
for( i=4;i>=0;i--)
AddData(nc3,a[i]);
}
void FreeNodeCtrl(NodeCtrl *nc)
{
Node *p,*q;
if(nc == NULL)
return;
if(nc->num > 0)
{
p = nc->head;
while(p != NULL)
{
q = p;
p = p->next;
free(q);
}
}
free(nc);
}
int main()
{
int i;
NodeCtrl *nc1 = CreateCtrl();
NodeCtrl *nc3 = CreateCtrl();
//观察多项式的最高项为x^4,所以创建五个结点的链表, 每个结点中储存其系数
AddData(nc1,1);
AddData(nc1,-5);
AddData(nc1,0);
AddData(nc1,1);
AddData(nc1,1);
Display(nc1);
printf("\n");
NodeCtrl *nc2 = CreateCtrl();
AddData(nc2,0);
AddData(nc2,0);
AddData(nc2,5);
AddData(nc2,1);
AddData(nc2,5);
Display(nc2);
printf("\n");
Display2(nc1,nc2,nc3);
Display(nc3);
FreeNodeCtrl(nc1);
FreeNodeCtrl(nc2);
FreeNodeCtrl(nc3);
return 0;
}


被折叠的 条评论
为什么被折叠?



