学习了数据结构后,才对指针有更深的了解,指针就是C 的灵魂。

  1#include<stdio.h>
  2#include<malloc.h>
  3#define LEN sizeof(Lnode)
  4typedef struct node{     //创建结构体节点
  5    int xishu;
  6    int zhishu;
  7    struct node *next;
  8}
Lnode,*Linklist;
  9void main(){
 10    char s;
 11    Linklist ha,hb,hc;
 12    Linklist creat();
 13    void out(Linklist);
 14    Linklist add(Linklist,Linklist);
 15start:
 16    printf("求多项式A,B的和\n");
 17    printf("请输入多项式A,按要求输入(指数按升序输入).\n以系数输入0表示结束\n");
 18    ha=creat();//创建A
 19    //输出A
 20    printf("A的结果为:\n A=");
 21    out(ha);printf("\n");
 22    printf("请输入多项式B,按要求输入(指数按升序输入).\n以系数输入0表示结束\n");
 23    hb=creat();//创建B
 24    //输出B
 25    printf("B的结果为:\n B=");
 26    out(hb);
 27    printf("\n");
 28    hc=add(ha,hb);
 29    printf("A+B的和为:");
 30    out(hc);
 31    printf("\n");
 32    printf("是否继续(y/n)? :");
 33    scanf("%s",&s);
 34    if(s=='y')
 35        goto start;
 36}
  //main结束
 37//创建多项式函数
 38Linklist creat(){
 39    Lnode *p,*s;
 40    Linklist h;
 41    int c,a0,i=1;
 42    s=(Lnode*)malloc(LEN);
 43    p=s;h=s;
 44    p->xishu=NULL;
 45    printf("请输入a0:");
 46    scanf("%d",&a0);
 47    s=(Lnode*)malloc(LEN);
 48    p->next=s;
 49    p=p->next;
 50    p->xishu=a0;
 51    p->zhishu=NULL;
 52    p->next=NULL;
 53    while(1){
 54        s=(Lnode*)malloc(LEN);
 55        printf("请输入第%d个系数:",i);
 56        scanf("%d",&c);
 57        if(c==0)
 58            break;
 59        p->next=s;
 60        p=s;
 61        p->xishu=c;
 62        printf("请输入第%d个系数对应的x的指数:",i);
 63        scanf("%d",&c);
 64        p->zhishu=c;
 65        p->next=NULL;
 66        i++;
 67    }

 68    return h;
 69}

 70//多项式输出函数
 71void out(Linklist h){
 72    Lnode *p;
 73    int a=0,b=0//a判断是否用"+”,b是否整个多项式为0
 74    p=h->next;
 75    while(p!=NULL){
 76        if(p->zhishu==NULL && p->xishu!=0){
 77            printf("%d",p->xishu);
 78            b=1;
 79            p=p->next;a=1;
 80            continue;
 81        }

 82        else if(p->xishu<0){
 83            if(p->xishu==-1)
 84                printf("-X");
 85            else
 86                printf("%dX",p->xishu);
 87            b=1;a=1;
 88            if(p->zhishu!=1
 89                printf("^%d",p->zhishu);
 90            
 91        }

 92        else if(p->xishu>0){
 93            if(a==1)printf("+");
 94            if(p->xishu!=1) printf("%d",p->xishu);
 95            printf("X");b=1;
 96            if(p->zhishu!=1) printf("^%d",p->zhishu);
 97            a=1;
 98        }

 99        p=p->next;
100    }

101    if(b==0)
102        printf("0");
103}

104//多项式A,B相加的函数add()
105Linklist add(Linklist ha,Linklist hb){
106    Linklist hc;  //定义c的头节点
107    Lnode *pa,*pb,*pc,*t;
108    pa=ha->next;pb=hb->next;
109    hc=ha;pc=hc;
110    free(hb);
111    while(pa && pb){
112        if(pa->zhishu!=NULL && pb->zhishu==NULL){//a无常数项,b有
113            pb=pb->next;
114            break;
115        }

116        else if(pa->zhishu==NULL && pb->zhishu!=NULL){//b无常数项,a有
117            pa=pa->next;
118            pc=pc->next;
119            break;
120        }

121        else if(pa->zhishu==NULL && pb->zhishu==NULL){//a,b都有常数项
122            pa->xishu=pa->xishu+pb->xishu;
123            pa=pa->next;pb=pb->next;
124            pc=pc->next;
125        }

126        else if(pa->zhishu > pb->zhishu){//a的指数项大
127            pc->next=pb;
128            pc=pc->next;
129            pb=pb->next;
130            pc->next=NULL;
131        }

132        else if(pa->zhishu<pb->zhishu){//b的指数项大
133            pc->next=pa;
134            pc=pc->next;
135            pa=pa->next;
136            pc->next=NULL;
137        }

138        else{                        //a,b的指数相同
139            pa->xishu=(pa->xishu)+(pb->xishu);
140            if(pa->xishu==0){        //和为0,删节点
141                t=pa;
142                pa=pa->next;
143                free(t);
144            }

145            else{
146                pc->next=pa;
147                pc=pc->next;
148                pa=pa->next;
149            }

150            t=pb;
151            pb=pb->next;
152            pc->next=NULL;
153            free(t);
154        }

155    }
//while 结束
156    if(pa)
157        pc->next=pa;
158    else
159        pc->next=pb;//剩余的结点加到链表
160    return hc;
161}
//add函数结束
162
posted on 2008-11-01 01:51  漫长路  阅读(766)  评论(0编辑  收藏  举报
宝宝客 www.baobaoke.com