数据结构C代码:多项式的加法

1、定义一个结构体,表示系数,次方和指针域。

#include<stdio.h>
#include<malloc.h>
//定义结构体,三个地址,分别表示系数,次方,指针域。 
typedef struct Linknode
{
	
	int coefficent;
	int exponent;
	struct Linknode *next;
}*linklist,*nodePtr;

2、初始化

//初始化结构体,全为空。
linklist initlinklist()
{
	//申请内存空间,为linklist申请一个大小为linknode的指针。 
	linklist tempHeader = (linklist)malloc(sizeof(struct Linknode));
	tempHeader->coefficent = 0;
	tempHeader->exponent  = 0;
	tempHeader->next = NULL;
	return tempHeader;
 } 

3、打印链表和结点

//打印链表
 void printlist(linklist paraHeader)
 {
 	//将链表依次打印出来。 
 	nodePtr p = paraHeader->next;
 	while(p != NULL)
 	{
 		printf("%d * 10^%d + ", p->coefficent,p->exponent);
 		p = p->next;
 		
	 }
	 printf("\r\n");
  } 
  
  //打印结点
  void printnode(nodePtr paraPtr,char paraChar)
  {
  	if(paraPtr == NULL)
  	{
  		printf("NULL\r\n");
  		
	  }
	  else 
	  {
	  	printf("the element of %c is (%d * 10^%d)\r\n",paraChar,paraPtr->coefficent,paraPtr->exponent);
	  }
   } 

4、连接函数的设计

//连接函数的设计
 void appendelement(linklist paraHeader, int paraCoefficient, int paraExponent)
 {
 	nodePtr p,q;//局部定义两个指针。
	 //第一步,申请一个新的空间 
	 q = (nodePtr)malloc(sizeof(struct Linknode));
	 q->coefficent = paraCoefficient;
	 q->exponent = paraExponent;
	 q->next = NULL; 
	 //第二步,寻找尾部。
	 p = paraHeader;
	 while(p->next != NULL)
	 {
	 	p = p->next;
	 	
	  } 
	  //第三步,连接链表。
	  p->next = q; 
   }  

5、设计一个加法运算的函数

   //设计一个加法运算函数
   void add(nodePtr paralist1,nodePtr paralist2)
   {
   	nodePtr p,q,r,s;
   	
   	//第一步,寻找位置。
	   p = paralist1->next;
	   printnode(p,'p');
	   q = paralist2->next;
	   printnode(q,'q');
	    r = paralist1;
		printnode(r,'r');
		free(paralist2);//释放第二个链表。
		
		while ((p != NULL) && (q != NULL))
		{
			if(p->exponent < q->exponent)
			{
				//连接当前节点。
				printf("case1\r\n");
				r = p;
				printnode(r,'r');
				p = p->next;
				printnode(p,'p'); 
			}
			else if((p->exponent > q->exponent))
			{
				//连接当前链表。
				printf("case2\r\n");
				r->next = q;
				r = q;
				printnode(r,'r');
				q = q->next;
				printnode(q,'q'); 
			}
			else
			{
				printf("case3\r\n");
				//交换当前链表。
				p->coefficent = p->coefficent + q->coefficent;
				printf("系数是:%d.\r\n",p->coefficent);
				if(p->coefficent ==0)
				{
					printf("case 3.1\r\n");
					s = p;
					p = p->next;
					printnode(p,'p');
					free(s);//释放s指针。 
				 } 
				 else
				 {
				 	printf("case 3.2\r\n");
				 	r = p;
				 	printnode(r,'r');
				 	p = p->next;
				 	printnode(p,'p');
				 }
				 s = q;
				 q = q->next;
				 printf("q is pointing to (%d,%d)\r\n",q->coefficent,q->exponent);
				 free(s);
			}
			printf("p = %ld,q = %ld\r\n",p,q);
		
		 } 
		 	printf("end of while.\r\n");
		 	
		 	if(p== NULL)
		 	{
		 		r->next = q;
			 }
			 else
			 {
			 	r->next = p;
			 }
			 printf("Addition ends.\r\n");
	} 

6、测试函数

   //测试函数
   void addtest()
   {
   	//第一步,初始化第一个多项式。
	   linklist templist1 = initlinklist();
	   appendelement(templist1,7,0); 
	   appendelement(templist1,3,1); 
	   appendelement(templist1,9,8); 
	   appendelement(templist1,5,17);
	   printlist(templist1);
	   
	   //第二步,初始化第二个多项式。
	     linklist templist2 = initlinklist();
	     appendelement(templist2,8,1);
	     appendelement(templist2,22,7);
	     appendelement(templist2,-9,8);
	     printlist(templist2);
	     //第三步,把他们添加到第一个进去。
		 add(templist1,templist2);
		 printlist(templist1); 
	     
	} 
	int main()
	{
		addtest();
		printf("完成!\r\n");
	}

总代码如下:

#include<stdio.h>
#include<malloc.h>
//定义结构体,三个地址,分别表示系数,次方,指针域。 
typedef struct Linknode
{
	
	int coefficent;
	int exponent;
	struct Linknode *next;
}*linklist,*nodePtr;


//初始化结构体,全为空。
linklist initlinklist()
{
	//申请内存空间,为linklist申请一个大小为linknode的指针。 
	linklist tempHeader = (linklist)malloc(sizeof(struct Linknode));
	tempHeader->coefficent = 0;
	tempHeader->exponent  = 0;
	tempHeader->next = NULL;
	return tempHeader;
 } 
 
 //打印链表
 void printlist(linklist paraHeader)
 {
 	//将链表依次打印出来。 
 	nodePtr p = paraHeader->next;
 	while(p != NULL)
 	{
 		printf("%d * 10^%d + ", p->coefficent,p->exponent);
 		p = p->next;
 		
	 }
	 printf("\r\n");
  } 
  
  //打印结点
  void printnode(nodePtr paraPtr,char paraChar)
  {
  	if(paraPtr == NULL)
  	{
  		printf("NULL\r\n");
  		
	  }
	  else 
	  {
	  	printf("the element of %c is (%d * 10^%d)\r\n",paraChar,paraPtr->coefficent,paraPtr->exponent);
	  }
   } 
 //连接函数的设计
 void appendelement(linklist paraHeader, int paraCoefficient, int paraExponent)
 {
 	nodePtr p,q;//局部定义两个指针。
	 //第一步,申请一个新的空间 
	 q = (nodePtr)malloc(sizeof(struct Linknode));
	 q->coefficent = paraCoefficient;
	 q->exponent = paraExponent;
	 q->next = NULL; 
	 //第二步,寻找尾部。
	 p = paraHeader;
	 while(p->next != NULL)
	 {
	 	p = p->next;
	 	
	  } 
	  //第三步,连接链表。
	  p->next = q; 
   }  
   
   //设计一个加法运算函数
   void add(nodePtr paralist1,nodePtr paralist2)
   {
   	nodePtr p,q,r,s;
   	
   	//第一步,寻找位置。
	   p = paralist1->next;
	   printnode(p,'p');
	   q = paralist2->next;
	   printnode(q,'q');
	    r = paralist1;
		printnode(r,'r');
		free(paralist2);//释放第二个链表。
		
		while ((p != NULL) && (q != NULL))
		{
			if(p->exponent < q->exponent)
			{
				//连接当前节点。
				printf("case1\r\n");
				r = p;
				printnode(r,'r');
				p = p->next;
				printnode(p,'p'); 
			}
			else if((p->exponent > q->exponent))
			{
				//连接当前链表。
				printf("case2\r\n");
				r->next = q;
				r = q;
				printnode(r,'r');
				q = q->next;
				printnode(q,'q'); 
			}
			else
			{
				printf("case3\r\n");
				//交换当前链表。
				p->coefficent = p->coefficent + q->coefficent;
				printf("系数是:%d.\r\n",p->coefficent);
				if(p->coefficent ==0)
				{
					printf("case 3.1\r\n");
					s = p;
					p = p->next;
					printnode(p,'p');
					free(s);//释放s指针。 
				 } 
				 else
				 {
				 	printf("case 3.2\r\n");
				 	r = p;
				 	printnode(r,'r');
				 	p = p->next;
				 	printnode(p,'p');
				 }
				 s = q;
				 q = q->next;
				 printf("q is pointing to (%d,%d)\r\n",q->coefficent,q->exponent);
				 free(s);
			}
			printf("p = %ld,q = %ld\r\n",p,q);
		
		 } 
		 	printf("end of while.\r\n");
		 	
		 	if(p== NULL)
		 	{
		 		r->next = q;
			 }
			 else
			 {
			 	r->next = p;
			 }
			 printf("Addition ends.\r\n");
	} 
   //测试函数
   void addtest()
   {
   	//第一步,初始化第一个多项式。
	   linklist templist1 = initlinklist();
	   appendelement(templist1,7,0); 
	   appendelement(templist1,3,1); 
	   appendelement(templist1,9,8); 
	   appendelement(templist1,5,17);
	   printlist(templist1);
	   
	   //第二步,初始化第二个多项式。
	     linklist templist2 = initlinklist();
	     appendelement(templist2,8,1);
	     appendelement(templist2,22,7);
	     appendelement(templist2,-9,8);
	     printlist(templist2);
	     //第三步,把他们添加到第一个进去。
		 add(templist1,templist2);
		 printlist(templist1); 
	     
	} 
	int main()
	{
		addtest();
		printf("完成!\r\n");
	}

运行结果如下:

72f62bf08f744e80a7091641eb7f21c0.png

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值