c语言结构体的加法,数据结构算法(多项式加法)的C语言完美实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

/*数据结构多项式加法用C语言的完美实现,书43页 算法 2.23[ 数据结构(C语言版) 严尉敏主编]*/

/*注释就不加了,本程序的所有函数书上都有说明*/

/*本程序Tourboc 2.0编译通过*/

#include 

#include 

#include 

#include 

#define  TURE 1

#define  FALSE 0

#define  OK  1

typedef  int  status;

typedef  struct {

float  coef;

int    expn;

}term,ElemType;

typedef  struct LNode {

ElemType data;

struct LNode *next;

}*link,*Position,NodeType;

typedef  struct {

link  head,tail;

int  len;

}linklist;

typedef  linklist  polynomial;

Position  Nextpos(linklist *l,link p)

{ if(l->head&&p->next)  return(p->next);

else    return  NULL;

}

int cmp(term a,term b)

{ if(a.expn>b.expn)  return 1;

else if(a.expn==b.expn)  return 0;

else  return -1;

}

status Makenode(link *p,ElemType e)

{ *p=(link)malloc(sizeof(NodeType));

if(!*p) {printf("Error,the memory is overflow!\n");exit(FALSE);}

(*p)->data=e;

(*p)->next=NULL;

return  OK;

}

status Initlist(polynomial *p)

{ p->head=(link)malloc(sizeof(NodeType));

if(!p->head)  { printf("Cannot find space!");exit(FALSE);}

p->len=0;

p->tail=p->head;

return  OK;

}

status Insfirst(polynomial *l,link *q,link s)

{ if(l->head&&*q&&s)

{ s->next=(*q)->next;(*q)->next=s;

if(l->tail==*q) l->tail=s;

l->len++;

}

}

status LocateElem(linklist *l,ElemType e,Position *q,int (*cmp)(ElemType,ElemType))

{ link p1;

int t;

if(l->head)

{p1=l->head;*q=p1->next;t=(*cmp)((*q)->data,e);

while(*q&&t) { p1=*q;*q=(*q)->next;}

if(*q&&t)   return  OK;

else

{*q=p1; return  FALSE;}

}

else  return FALSE;

}

status Delfirst(polynomial *l,link *h,link *q)

{ if((*h)->next)

{ *q=(*h)->next;(*h)->next=(*q)->next;

if(l->tail==*q) l->tail=l->head;

l->len--;

}

}

status Append(linklist *l,link s)

{ if(l->head&&s)

{if(l->tail!=l->head)  l->tail->next=s;

else l->head->next=s;

l->tail=s;

l->len++;

}

}

void Creatpolyn(polynomial **p,int m)

{ ElemType e;

link h,q,s;

int i;

Initlist(*p);

h=(*p)->head;

e.coef=0.0;e.expn=-1;h->data=e;h->next=NULL;

printf("Input Coef and Expn:\n");

for(i=1;i<=m;i++)

{scanf("%f%d",&e.coef,&e.expn);

if(!LocateElem(*p,e,&q,cmp))

if(Makenode(&s,e))   Insfirst(*p,&q,s);

}

}

void Addpolyn(polynomial **pa,polynomial **pb)

{ link ha,hb,qa,qb;

ElemType a,b;

int sum;

ha=(*pa)->head;hb=(*pb)->head;

qa=Nextpos(*pa,ha);qb=Nextpos(*pb,hb);

while(qa&&qb)

{ a=qa->data;b=qb->data;

switch(cmp(a,b))

{case  -1:

ha=qa;qa=Nextpos(*pa,qa);break;

case  0:

sum=a.coef+b.coef;

if(sum!=0.0)

{qa->data.coef=sum;

ha=qa;

}

else

{Delfirst(*pa,&ha,&qa);free(qa);

}

Delfirst(*pa,&hb,&qb);free(qb);qb=Nextpos(*pb,hb);

qa=Nextpos(*pa,ha);break;

case  1:

Delfirst(*pa,&hb,&qb);Insfirst(*pa,&ha,qb);

qb=Nextpos(*pb,hb);ha=Nextpos(*pa,ha);break;

}

}

if((*pb)->head!=(*pb)->tail) Append(*pa,qb);

free(hb);

}

void print(polynomial *l)

{ link p;

p=l->head;

p=p->next;

printf("\n");

while(p)

{ printf("%f X^%d",p->data.coef,p->data.expn);

p=p->next;

if(p) printf("+");

}

printf("\n");

}

main()

{polynomial *p1,*p2;

link a1,a2;

int n1,n2;

printf("\nInput the length of polynomial L1(n1):\n");

scanf("%d",&n1);

Creatpolyn(&p1,n1);

printf("\nThe Polynomial L1:\n");

print(p1);

printf("\nInput the length of polynomial L2(n2):\n");

scanf("%d",&n2);

Creatpolyn(&p2,n2);

printf("\nThe Polynomial L2:\n");

print(p2);

Addpolyn(&p1,&p2);

printf("\nPolynomial L1 + Polynomial L2:\n");

print(p1);

}

——Djl23 于05年10月9日

后面的算法源代码将陆续公布�

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值