单链表多项式相加

/*
    time:2014-10-06 00.17
    author:halfopen
    version: 1

*/
#include <stdio.h>
#include <stdlib.h>

typedef struct eNode{
    int b;
    int e;
    eNode *next;
}LinkList;
void InitList( LinkList *&L );
bool InsertList( LinkList *&L, int b, int e);
void DispList( LinkList *&L);
LinkList* ListFind( LinkList *&L, int e);
void Add( LinkList *&L1, LinkList *&L2);
int main()
{    LinkList *L1,*L2;
    int b,e;
    InitList( L1 );
    InitList( L2 );
    puts("Add ax^b to L1,please input \"a b\"");
    while(scanf("%d%d",&b,&e) == 2)
    {    if( 0 == b)break;
        InsertList( L1, b, e);
        DispList( L1);
        puts("input \"a b\"");
    }
    puts("Add ax^b to L2,please input \"a b\"");
    while(scanf("%d%d",&b,&e) == 2)
    {    if( 0 == b)break;
        InsertList( L2, b, e);
        DispList( L2);
        puts("input \"a b\"");
    }
    printf("End inputs:\n");
    printf("1:  ");DispList( L1);
    printf("2:  ");DispList( L2);
    puts("Add:");
    Add( L1, L2);
    DispList( L1);
    return 0;
}
void Add( LinkList *&L1, LinkList *&L2)
{    LinkList *p = L2->next;
    while(p!=NULL)
    {    InsertList( L1, p->b,p->e);
        p = p->next;
    }
    //DispList(L1);
}
void InitList( LinkList *&L )
{    L = ( LinkList *)malloc( sizeof(LinkList));
    L->b = 0;
    L->e = 0;
    L->next = NULL;
}
bool InsertList( LinkList *&L, int b, int e)
{    LinkList *p = L, *s;
    while(p->next != NULL)
    {    if(e == p->e)//1
        {    p->b += b;
            return false;
        }
        if(p->next != NULL && p->next->e <e)break;//move to the right place
        p = p->next;
        if(p->next == NULL&& e == p->e)//2
        {    p->b += b;
            return false;
        }
    }
    s = (LinkList *)malloc( sizeof( LinkList)); //create a new node ,and insert it after p
    if(p->next != NULL)
    {    s->next = p->next;    //link to the next node if it exists
    }
    else s->next = NULL;
    p->next = s;
    s->b = b;
    s->e = e;
    return true;
}
LinkList* ListFind( LinkList *&L, int e)// find e in L
{    LinkList *p = L->next;
    while(NULL != p->next)
    {    if( e == p->e)return p;    
        p = p->next;
    }    
    return NULL;
}
void DispList( LinkList *&L)//ok
{    LinkList *p = L->next;
    while( p!= NULL)
    {    //printf("BE%d %d \n",p->b,p->e);    
        if(p->b != 1)printf("%d",p->b); // x
        if(p->e != 0)    // if p->e == 0, it should be only a number
        {    if(p->e == 1)printf("x");
            else printf("x^%d",p->e);
        }
        if(p->b == 1 && p->e == 0)printf("1");
        if( p->next !=NULL)printf(" + ");// if it need to add +
        else{ puts("");break;}
        p = p->next;        
    }
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值