用链表实现多项式的加减(链表写入数据用头插法)


今天学习了用链表实现多项式的加减运算 

实现的思路是这样的

(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值