标题:求添加一个相减的运算
只看楼主
田宇
Rank: 1
等 级:新手上路
帖 子:2
专家分:1
注 册:2012-10-11
结帖率:0
已结贴  问题点数:20 回复次数:2 
求添加一个相减的运算
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct Linknode        //定义链表节点的数据类型为Node
{
    int coef;        //定义系数
    int exp;         //定义指数
    struct Linknode *next;
}Node;


Node * createlink()      //创建链表并读入多项式的指数和系数
{
    Node *L,*s,*h;
    int c,e,i =1;
    L=(Node *)malloc(sizeof(Node));
    h=L;
    printf("第%d项的系数和指数分别为:",i);  
    scanf("%d",&c);
    scanf("%d",&e);
    i++;
    while(c!=0)  
       //读入系数和指数直到系数输入为0
    {
        s=(Node *)malloc(sizeof(Node));
        s->coef=c;
        s->exp=e;
        h->next=s;
        h=s;  
        printf("第%d项的系数和指数分别为:",i);  
        scanf("%d",&c);
        scanf("%d",&e);
        i++;
    }
    h->next=NULL;
    return(L);
}
 
Node* PaiXu(Node *head,int n)                     //对多项式进行幂的降次排序函数
{
    int i=0,z=0,k,g,v,a[100],b[100];   //建立两个数组用来存放运算后的多项式然后进行排序
    struct Linknode *s1,*s2;
    while(head)
    {
        a[i]=head->coef;
        b[i]=head->exp;
        i++;
        head=head->next;
    }
    for(k=0;k<n;k++)   //寻找幂相同的数据,然后进行下面的操作
    {
        for(g=k+1;g<n;g++)
        {
            if(b[k]==b[g])
            {
                a[k]=a[k]+a[g];   //找到幂相同的数据后把系数相加指数不变
                a[g]=0;   //然后把一个相同的数据的系数和指数都置为0
                b[g]=0;
            }
        }
    }
    for(k=0;k<n;k++)   //此处运用了冒泡排序
    {
        for(g=0;g<n-k;g++)
        {
            if(b[g]<b[g+1])
            {
                v=b[g];   //循环按降次排序,同时也交换系数所在的位置
                b[g]=b[g+1];
                b[g+1]=v;
                v=a[g];
                a[g]=a[g+1];
                a[g+1]=v;
            }
        }
    }
    s1=s2=(Linknode *)malloc(sizeof(Linknode));  //把排序好的数据存放到链表里,返回头指针
    for(k=0;k<n;k++)
    {
        if(a[k]!=0)
        {
            s1->coef=a[k];
            s1->exp=b[k];
            z++;
            if(z==1)
            {
                head=s1;   //head为头指针
            }
            else
            {
                s2->next=s1;
            }
            s2=s1;
            s1=(Linknode *)malloc(sizeof(Linknode));
        }
    }
    s2->next=NULL;
    return(head);
}

Node* Sum(Node *pa, Node *pb)    //两多项式相加
{  
    Node *p,*q,*pre,*temp,*o;
    int sum;
    p=pa->next;
    q=pb->next;
    o=pre=pa;
    while(p!=NULL&&q!=NULL)
    {  
        if(p->exp<q->exp)   //p所指结点指数小于q  
        {
            pre->next=p;   //将p所指的结点赋给和多项式所在的链表
            pre=pre->next;   
            p=p->next;   //p继续指向下一个结点
        }  
        else if(p->exp==q->exp)//p和q所指结点的指数相等
        {   
            sum=p->coef+q->coef;   //系数相加
            if(sum!=0)   // 系数和不为0
            {
                p->coef=sum; //p所指结点的系数改为sum
                pre->next=p; //将该结点赋给和多项式链表
                pre=pre->next;
                p=p->next;
                temp=q;
                q=q->next;   
                free(temp);   //释放内存
            }   
            else   //系数和为0,释放该结点所在空间  
            {
                temp=p->next;  
                free(p);
                p=temp;  
                temp=q->next;
                free(q);  
                q=temp;
            }
        }  
        else   // p所指结点指数大于q 所指结点指数
        {
            pre->next=q;   //将q所指结点赋给和多项式链表
            pre=pre->next;  
            q=q->next; //q指向下一个结点
        }
    }
    if(p!=NULL)      //多出的多项式全赋给和多项式链表  
        pre->next=p;
    else
        pre->next=q;  
    o=o->next;
    return (o);
}


void print(Node * p) //输出所有的项
{   
    while(p->next!=NULL)
    {
        p=p->next;  
        printf(" %+d*x^%d",p->coef,p->exp);
    }
    printf("\n=============================");
 }

void print2(Node * p) //输出所有的项
{   
    while(p!=NULL)
    {
         
        printf(" %+d*x^%d",p->coef,p->exp);
        p=p->next;
    }
    printf("\n=============================");
 }

void JIAN()
{
    printf("使用减法拉");
}


 void fu()     
 {
     int n;
     void ADD();
     printf("1 相加  2 相减 \n");
     scanf("%d",&n);
     switch (n)
     {
         case 1 :ADD();break;
         case 2 :JIAN();break;
     }
 }

 void ADD()   
 {
     Node * pa,* pb;
     printf("\n请输入第一个多项式各项的系数和指数,系数和指数为0表示输出完毕:\n");
     pa=createlink();
     print(pa);
     printf("\n请输入第二个多项式各项的系数和指数,系数和指数0表示输出完毕:\n");
     pb=createlink();
     print(pb);
     printf("\n两多项式的和是:\n");
     pa=Sum(pa,pb);
     pa=PaiXu(pa,4);
     print2(pa);
     printf("\n");
     fu();
 }





 void main()
 {
     printf("欢迎使用加减法计算器\n");
     fu();
 }
搜索更多相关主题的帖子: 系数 include 多项式 
2012-12-21 09:23
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
得分:10 
DING

Go Go Go
2012-12-21 09:32
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
得分:10 

void sub()
{
int i = 0;
int j = 0;
int end = 0;
    end = i-j;

    printf("end = %d \n",end);
}
2012-12-21 09:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-392566-1-1.html




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

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