数据结构应用-------------多项式的相加

 
/*----------------------------------------------------------------------------------
	程序说明:
	这一个程序是《数据结构》这本书上面的例子来的。
	功能是实现两个多项式的相加。

	这一个程序的核心代码(伪代码)是来源于书上。而我的工作就是将它实现。虽然书上面提供的
	最核心思想,但是如果完照抄书上面的代码,你会发现其实那些代码是十分坑爹的,尤其是要
	用到指针的地方。本应是要用引用或者指针的,可是书上往往会写成直接传数值,而不是地址
	或者引用。


	总结:
	如果不是那么严格,这一个小小程序,应该可以算是一个比较小的课程设计吧。不过,这一个
	程序虽小,但是我也足足花一个下午加上晚上的时间才完成。本来,我打算一个下午时间就可以
	完成的。谁知道,竟然大部分时间用在调试方面。尤其是在结构指针上面,往往忘记了分配内存
	就使用。看来是太久没有动手做点比较大的东西。。

	-------------------------------------------------------------------------------*/






/*---------------------------------------------------------------------------------
	addpolyn.c
	提供测试代码

	edited by Seed,2011

	-------------------------------------------------------------------------------*/




#include<stdio.h>
#include"addpolyn.h"


int main(void)
{

	Polynomial Pa, Pb ;
	int m ;
	

	printf("请输入多项式 A 的项数 :  ") ;  //构造多项式A
	scanf("%d",&m) ;
	CreatPolyn(&Pa,m) ;


	PrintPolyn(Pa) ;


	printf("请输入多项式 B 的项数 :  ") ;  //构造多项式B
	scanf("%d",&m) ;
	CreatPolyn(&Pb,m) ;


	PrintPolyn(Pb) ;


	AddPolyn(&Pa, &Pb) ;   //合并A和B

	PrintPolyn(Pa) ;

	Destroy(&Pa) ;

	return 0 ;
}


/*------------------------------------------------------------------
	File : addpolyn.h
	Fuction : 提供各种各样的定义

	edited by Seed , 2011
	----------------------------------------------------------------*/


#ifndef ADDPOLYN_H_
#define ADDPOLYN_H_




/*-----------------------------------------------------------
	数据类型定义

	---------------------------------------------------------*/

typedef struct
{
	float coef ;
	int expn ;
} term, ElemType ;


typedef struct LNode
{
	ElemType data ;
	struct LNode *next ;
} LNode ,*Link, *Position ;


typedef struct
{
	Link head , tail ;
	int len ;
} LinkList ;


typedef LinkList Polynomial ;




/*---------------------------------------------------------
	函数头声明、以及定义函数返回值定义


	-------------------------------------------------------*/



typedef int Status ;

#define OK 1 
#define ERROR 0
#define TRUE 1
#define FALSE 0



Link  GetHead(Polynomial *P) ;

Status InitList(Polynomial *P) ;

Status SetCurElem(Link *p,ElemType e) ;

Status LocateElem(Polynomial *P,ElemType e,Position *q,int (*compare)(ElemType,ElemType) ) ;

Status MakeNode(Link *p,ElemType e) ;

Status InsFirst(Link h,Link s) ;

int cmp(term a,term b) ;

void CreatPolyn(Polynomial *P ,int m) ;

Link NextPos(Polynomial *P, Link l) ;

ElemType GetCurElem(Link p)  ;

void FreeNode(Link P) ;

Status ListEmpty(LinkList L) ;

Status Append(LinkList *L,Link s) ;

void AddPolyn(Polynomial *Pa, Polynomial *Pb) ;

void Destroy(Polynomial *P) ;

void PrintPolyn(Polynomial P) ;




#endif  






/*------------------------------------------------------------------
	File : polyn.h
	Fuction : 提供接口的实现

	edited by Seed , 2011
	----------------------------------------------------------------*/



#include"addpolyn.h"
#include<stdio.h>
#include<stdlib.h>



Link GetHead(Polynomial *P)
{
	return (P->head) ;
}  //GetHead


Status InitList(Polynomial *P)
{

	if((P->head = P->tail = (Link) malloc(sizeof(LNode))) == NULL) //我曾经在这里写成p->head = p->tail = e ;但是这会造成程序崩溃
	{
		printf("Can't assign room\n") ;
		exit(1) ;
	}
																		//因为e只是临时变量,函数返回时会自动释放,所以函数返回时不存在,														
	P->len = 0 ;															//也就是说指向了已经释放的内存.

	P->head->next = NULL ;


	return OK ;

}  //InitList


Status SetCurElem(Link *p,ElemType e)
{
	if(NULL == p)
	{
		printf("Error\n") ;
		return ERROR ;
	}                           
	else
	{
		
		(*p)->data = e ;

		return OK ;
	}
}  //SetCurElem



int cmp(term a,term b)
{
	if(a.expn > b.expn )
		return 1 ;
	else if(a.expn == b.expn )
		return 0 ;
	else 
		return -1 ;
} // cmp


Status LocateElem(Polynomial *P,ElemType e,Link *q,int (*compare)(ElemType,ElemType) )
{
	Link temp = (Link)malloc(sizeof(LNode)) ;		
	Link pre = (Link) malloc(sizeof(LNode)) ;
	
	ElemType t ;

	temp = P->head->next  ;
	pre = P->head ;

	while(temp != NULL)
	{
		t = temp->data ;
		
		switch((*compare)(t,e))
		{
		case 1 :
			(*q) = pre ;						
			return 1 ;
			
		case 0 :
			return 0 ;
		}                             //switch-case             

		temp = temp->next ;
		pre = pre->next ;
	}                                //while

	return -1 ;

}  //LocateElem



Status MakeNode(Link *p,ElemType e)
{	
	if(((*p) = (Link) malloc(sizeof(LNode))) != NULL)
	{
		(*p)->data = e ;
		(*p)->next = NULL ;
		return TRUE ;
	}

	return FALSE ;
}  //MakeNode



Status InsFirst(Link h,Link s)  
{
	Link temp ;
	if((temp = (Link) malloc(sizeof(LNode))) != NULL )
	{
		temp = h->next ;

		s->next = temp ;

		h->next = s ;


		return OK ;
	}

	return FALSE ;
}



void CreatPolyn(Polynomial *P ,int m)
{
	Link  h ,s = NULL;
	ElemType  e ;
	int i = 0 ;
	Link *q = (Link *) malloc(sizeof(LNode)) ;
	Link last = (Link) malloc(sizeof(LNode)) ;


	e.coef = 0.0 ;
	e.expn = -5 ;

	InitList(P) ;

    h = GetHead(P) ;




	if(!SetCurElem(&h,e))
	{
		printf("The pointer is NUUL\n") ;
		exit(1) ;
	}

	for(i = 0 ; i < m ; i++)
	{
		printf("\n请输入系数:") ;
		scanf("%f",&(e.coef )) ;

		printf("\n请输入指数: ") ;
		scanf("%d",&(e.expn) ) ;

		switch(LocateElem(P,e,q,cmp))
		{
		case 0 :
			break ;
			
		case 1 :
			if(MakeNode(&s,e))
			{
				if(InsFirst(*q,s))
				{
					P->len++ ;
				}
			}
			break ;

		case -1 :
			if(MakeNode(&s,e))
			{
				last = P->tail ;
				
				last->next = s ;
				
				P->tail = s ;

				P->len++ ;			
			}                //if
			break ;
		}//switch
	}  //for
		
}  //CreatPolyn


Link NextPos(Polynomial *P, Link l)
{
	Link cur = P->head ;
	
	while(cur != l && cur != NULL)
		cur = cur->next ;

	if(NULL == cur)
		return NULL ;
	else
		return l->next ;

} //NextPos


ElemType GetCurElem(Link p) 
{
	return p->data ;
} //GetCurElem

Status DelFirst(Link h, Link q)
{
	Link temp ;
	
	if(NULL == h->next )
	{
		q = NULL ;
		return ERROR ; 
	}

	temp = h->next ;
	h->next = h->next ->next ;
	q = temp ;

	return OK ;
} //DelFirst 



void FreeNode(Link P)
{
	if(NULL == P)
		;
	else
	{
		free(P) ;
		P = NULL ;
	}
} //FreeNode



Status ListEmpty(LinkList L)
{
	if(L.head == L.tail)
		return TRUE ;
	else
		return FALSE ;
} //ListEmpty

Status Append(LinkList *L,Link s)
{

	int count = 0 ;

	L->tail->next = s ;


	while(s != NULL)
	{
		s = s->next ;
		count++ ;
	}

	L->tail = s ;
	L->len += count ;

	return TRUE ;

}//Append 

void AddPolyn(Polynomial *Pa,Polynomial *Pb)
{
	Link ha ,hb ;
	Link qa, qb ;

	ElemType a ,b ;

	float sum ;

	ha = GetHead(Pa) ;
	hb = GetHead(Pb) ;

	qa = NextPos(Pa,ha) ;
	qb = NextPos(Pb,hb) ;

	

	while((qa != NULL) && (qb != NULL))
	{
		a = GetCurElem(qa) ;
		b = GetCurElem(qb) ;

		switch(cmp(a,b))
		{
		case -1 :
			ha = qa ;
			qa = NextPos(Pa,qa) ;
			break ;

		case 0 :
			sum = a.coef + b.coef ;

			a.coef = sum ;

			if(sum != 0.0)
			{
				SetCurElem(&qa,a) ;      //Status SetCurElem(Link *p,ElemType e)
				ha = qa ;
			}
			else
			{
				if(DelFirst(ha,qa))
				{
					Pa->len-- ;
				}
				FreeNode(qa) ;
			}

			DelFirst(hb,qb) ;
			FreeNode(qb) ;
			qb = NextPos(Pb,hb) ;
			qa = NextPos(Pa,ha) ;
			break ;

		case 1 :
			DelFirst(hb,qb) ;
			InsFirst(ha,qb) ;
			qb = NextPos(Pb,hb) ;
			ha = NextPos(Pa,ha) ;

			break ;
		}  //switch
	}  //while


	if(!ListEmpty(*Pb))
	{
		Append(Pa,qb) ;
	}

	FreeNode(hb) ;

}  //AddPolyn



void Destroy(Polynomial *P)
{
	Link h = P->head ;
	Link temp ;

	while(h != NULL)
	{
		temp = h ;
		h = h->next ;
		free(temp) ;
	}

} //Destroy


void PrintPolyn(Polynomial P)
{
	Link h= P.head ;

	while(h != NULL) 
	{
		printf("%.2f^%d + " ,h->data.coef ,h->data.expn ) ;
		h = h->next ;
	}

	printf("\n\n\n") ;

} //PrintPolyn




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值