| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 993 人关注过本帖
标题:数据结构多项式运算---加法和减法单独可用,放在一起就死了--求哪位大侠路过 ...
只看楼主 加入收藏
流浪的面包树
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-10-5
收藏
 问题点数:0 回复次数:0 
数据结构多项式运算---加法和减法单独可用,放在一起就死了--求哪位大侠路过看看,小妹不胜感激
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define ERROR     0
#define OK        1

//定义多项式链表的'结点'存储结构,每一个结点对应稀疏多项式中的一项
typedef struct LNode{ //LNode为结构体类型,为多项式结点
     float coef; //多项式的系数
     int expn; //多项式的指数
     struct LNode *next; //指向下一个多项式结点的指针
} *Link; //定义了一个新的类型Link,该类型变量是指向多项式结点的指针

//定义'多项式链表'存储结构
typedef struct{
     Link head;
     Link tail; //指向多项式链表的‘头结点’、‘尾结点’的指针
     int len; //多项式链表中除去头结点后的结点数,即多项式的项数
}LinkList;

typedef LinkList Polynomial; //定义一元稀疏多项式类型Polynomial

//基本操作的定义
int MakeNode(Link& p, float coef, int expn);
//生成结点
void InitList(LinkList& L);
/* 初始化一个带头节点单链表头、尾指针均指向_head, _tail头结点 */
void DestroyList(LinkList& L);
/*销毁带头节点单链表L,多项式链表使用完后,应将链表占用的内存进行释放,
释放结点内存可使用C++中的delete操作*/
void CreatPolyn(Polynomial& p, double& coef, int& expon);
/*基于用户输入的一元多项式系数向量和指数向量
vector<double>& coef, vector<int>& expon 生成一元稀疏多项式链表*/
void DestroyPolyn(Polynomial& p);
/*销毁一元稀疏多项式链表,程序结束前应调用此函数释放多项式链表内存*/
void PrintPolyn(Polynomial& p);
/*以多项式指数递减格式输出一元稀疏多项式,例如:
34X^100 + 45X^60 – 4X^2 + 3*/

/*两个一元稀疏多项式Pa、Pb相加、相减、相乘,生成和多项式链表PSum*/
void AddPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSum);
void SubPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSub);
void MultiplyPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PMulti);

void count_P(Polynomial& P,float x);
//给一个x值求多项式的值

//基本操作的实现
int MakeNode(Link& p, float c, int e)//生成新结点,并在前后结点间建立连接//此函数出错--已解决
{
    Link f;
    f=(Link)malloc(sizeof(LNode));
    p->next=f;//在前一个结点和后一个结点间建立连接
    f->next=NULL;
    f->coef=c;
    f->expn=e;
    p=f;

    //printf("结点为%fX^%d\n",f->coef,f->expn);
   
    return OK;
}

void InitList(LinkList& L)//初始化列表
{  
    LNode *p;
    p=(LNode *)malloc(sizeof(LNode));//p为头结点
    L.head=p;
    L.tail=p;//让头指针和尾指针都指向头结点
    L.len=0;

 }


/* 根据用户输入的多项式的系数和指数float coef, int expn,生成多项式结点*/
//接收参数链表的首地址和结点的个数m
void CreateList_L(Polynomial &P,int m)
{
 int i,b;
 float a;
InitList(P);//生成头结点,并使P的头指针和尾指针都指向头结点
Link q=P.head;

printf("头结点地址为%d\n",q);

 for(i=1;i<=m;i++)//依次输入m个非零项//不停输出--循环出错:此处或打印时的循环//已解决
 {   
     printf("请输入多项式项的系数\n");
     scanf("%f",&a);
     printf("请输入多项式项的指数\n");
     scanf("%d",&b);
     MakeNode(q,a,b);
     P.tail=q;
     P.len++;
    //printf("%f    %d",a,b);
 }
}

void PrintPolyn(Polynomial& q)//以多项式指数递减格式输出一元稀疏多项式,例如:
//34X^100 + 45X^60 – 4X^2 + 3
{
    printf("多项式为:\n");//之后发生错误
    Link r=q.head->next;//指针的值是它内部所存的地址值,并不存在内建的间接访问
    Link s;
    //从第二个结点开始比较,因为头结点没有数据
    while(r!=NULL)//选择排序//问题:当用户输入相同的指数的项
        //先让第一个与它之后所有元素比较,找到最大的,与r交换;用第二个元素与它之后所有元素比较,找到最大的,与第二个交换,如此
    {
        Link max=r;
        Link j;
        for(j=r->next;j!=NULL;j=j->next)
        
            if(j->expn>max->expn)//如果指针j指向的结点的指数比当前的max大,则把*j的值赋给max,用于下次比较
                max=j;
        
        if(max->expn>r->expn)//检查当前的max是不是当前所比较的数中的最大值
        {
            static float tempCoef;
            static int tempExpn;//只交换结点的数据域

            tempCoef=max->coef;
            tempExpn=max->expn;

            max->coef=r->coef;
            max->expn=r->expn;

            r->coef=tempCoef;
            r->expn=tempExpn;

            
            //printf("%fX^%d",r->coef,r->expn);
        }
        r=r->next;
    }
    for(s=q.head->next;s!=NULL;s=s->next)
    {
        printf("%fX^%d",s->coef,s->expn);
        if(s->next!=NULL) printf("+");
    }
    printf("\n");
}


void AddPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSum)//两个链表做加法
{
    //定义两个‘工作’指针aPtr、bPtr,初始时分别指向Pa、Pb的头结点,
//在多项式链表相加时,指向相加的当前项。
    LNode* aPtr = Pa.head->next; LNode* bPtr = Pb.head->next;
    Link e,e1,e2;
    InitList(PSum); //生成和多项式链表,此时该链表只有一个头结点
    LNode* SPtr=PSum.head;
    while( aPtr && bPtr ){
        //比较Pa、Pb链表中当前项的指数;
        if ( aPtr->expn > bPtr->expn ) { //if 1
        //则复制一个Pa的当前结点,并将其插入到和多项式链表PSum中;
        //aPtr++指向Pa中下一个结点;
            MakeNode(SPtr,aPtr->coef, aPtr->expn);
            e=aPtr;
            aPtr=aPtr->next;
            free(e);
        }
        else if(aPtr->expn <bPtr->expn){
            MakeNode(SPtr,bPtr->coef, bPtr->expn);
            e=bPtr;
            bPtr=bPtr->next;
            free(e);
        }
        else
        {
            MakeNode(SPtr,bPtr->coef+aPtr->coef, bPtr->expn);
            e1=bPtr;
            e2=aPtr;
            bPtr=bPtr->next;
            aPtr=aPtr->next;

            free(e1);free(e2);

        }
    }//end while
    //aptr或bPtr中剩下元素的处理
    if(aPtr){
        while(aPtr) {
            MakeNode(SPtr,aPtr->coef, aPtr->expn);
            e=aPtr;
            aPtr=aPtr->next;
            free(e);
        }
    }
    else if(bPtr){
        while(bPtr){
            MakeNode(SPtr,aPtr->coef, aPtr->expn);
            e=bPtr;
            bPtr=bPtr->next;
            free(e);
        }
    }
   printf("两多项式之和为:");
   Link r;
   for( r=PSum.head->next;r!=NULL;r=r->next)
    {
        printf("%fX^%d",r->coef,r->expn);
        if(r->next!=NULL) printf("+");
    }
}

void SubPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSub)
{
    //定义两个‘工作’指针aPtr、bPtr,初始时分别指向Pa、Pb的头结点,
//在多项式链表相加时,指向相加的当前项。
    LNode* aPtr = Pa.head->next; LNode* bPtr = Pb.head->next;
    Link e,e1,e2;
    InitList(PSub); //生成和多项式链表,此时该链表只有一个头结点
    LNode* SPtr=PSub.head;
    while( aPtr && bPtr ){
        //比较Pa、Pb链表中当前项的指数;
        if ( aPtr->expn > bPtr->expn ) { //if 1
        //则复制一个Pa的当前结点,并将其插入到和多项式链表PSum中;
        //aPtr++指向Pa中下一个结点;
            MakeNode(SPtr,aPtr->coef, aPtr->expn);
            e=aPtr;
            aPtr=aPtr->next;
            free(e);
        }
        else if(aPtr->expn <bPtr->expn){
            MakeNode(SPtr,bPtr->coef, bPtr->expn);
            e=bPtr;
            bPtr=bPtr->next;
            free(e);
        }
        else
        {
            MakeNode(SPtr,bPtr->coef-aPtr->coef, bPtr->expn);
            e1=bPtr;
            e2=aPtr;
            bPtr=bPtr->next;
            aPtr=aPtr->next;

            free(e1);free(e2);

        }
    }//end while
    //aptr或bPtr中剩下元素的处理
    if(aPtr){
        while(aPtr) {
            MakeNode(SPtr,aPtr->coef, aPtr->expn);
            e=aPtr;
            aPtr=aPtr->next;
            free(e);
        }
    }
    else if(bPtr){
        while(bPtr){
            MakeNode(SPtr,aPtr->coef, aPtr->expn);
            e=bPtr;
            bPtr=bPtr->next;
            free(e);
        }
    }
   printf("两多项式之和为:");
   Link r;
   for( r=PSub.head->next;r!=NULL;r=r->next)
    {
        printf("%fX^%d",r->coef,r->expn);
        if(r->next!=NULL) printf("+");
    }
}

void MultiplyPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PMulti)//乘法
{
    Link aPtr,bPtr;
    Link e1,e2;
    InitList(PMulti); //生成和多项式链表,此时该链表只有一个头结点
    Link SPtr=PMulti.head;
    for(aPtr = Pa.head->next;aPtr!=NULL;aPtr++){
        for(bPtr = Pb.head->next;bPtr!=NULL;bPtr++)
        {
            MakeNode(SPtr,aPtr->coef*bPtr->coef,aPtr->expn+bPtr->expn);
            e1=bPtr;free(e1);
            SPtr++;
        }
        e2=aPtr;
       free(e2);
    }
   
    printf("两多项式相乘为:");PrintPolyn(PMulti);
   
}



//end 基本操作
            
void main()
{
    int m;
    Polynomial a,b,p;//a、b为用户输入的多项式,p用于保存相减、相减等操作的多项式
   
    printf("请输入链表a长度\n");//接收链表a的长度
    scanf("%d",&m);
    CreateList_L(a,m);//调用CreateList_L函数来建链表a
    PrintPolyn(a);
   
    printf("请输入链表b长度\n");//接收链表b的长度
    scanf("%d",&m);
    CreateList_L(b,m);//调用CreateList_L函数来建链表a
    PrintPolyn(b);
   
    AddPolyn(a,b,p);SubPolyn(a,b,p);MultiplyPolyn(a,b,p);

   
}

错误信息小妹已经放在附件里了
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 加法 减法 小妹 数据结构 多项式 
2009-10-17 09:40
快速回复:数据结构多项式运算---加法和减法单独可用,放在一起就死了--求哪位大 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017117 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved