数据结构学习笔记——单链表实现多项式加法

一元n次多项式的加法(单链表实现)

下面展示一些 代码

首先是单链表结构体的定义

typedef struct LNode
{
	int Base_number;
	int Index_number;
	
	struct LNode *Next;
	
}LNode,*LinkList;

typedef 将 struct LNode 的名字重定义成 LNode,将指向LNode的指针重定义成LinkList。

以下是用到的一些函数。

    void Creat(LinkList &polynomial); //根据输入的值来创建单链表保存多项式
    
	void Print(LinkList polynomial);//输出加完后的多项式
	
	int Conmpare(int x, int y);//比较两个多项式中某个项的次数大小,后面用switch语句区别三种不同的大小情况
	
	void Attach(int x, int y, LinkList *p);将某一项添加到保存最终结果的单链表中。
	
	LinkList add(LinkList p1, LinkList p2);核心方法,实现加法

下面给出他们各自的定义

void Creat(LinkList &polynomial) 
{
	int base,index;

	LinkList p,q;
	
	polynomial = new LNode;
	 
	polynomial -> Next = NULL;
	
	p = polynomial;
	
	cout <<"输入项式,按(0,0)结束";
	int x,y;
	
	scanf("%d,%d",&x,&y)  ;              //这里用scanf函数可以轻松实现 输入0,0类型的数据 
	 
	while (x!= 0 || y != 0)
	{
		q = new LNode;
		
        q -> Base_number = x;
        q -> Index_number = y;
        q -> Next = NULL;
        
        p -> Next = q;
        p = q;
        
        scanf("%d,%d",&x,&y) ;
		
	}
} 
之前学的只学过cin语句,但在这里用cin的话,没法实现x,y形式的输入。

下面列一下scanf的基础知识:
scanf的基本格式:scanf(格式控制, 地址列表);

int a;  scanf(“%d”,&a);
int a,b;  scanf(“%d%d”,&a,&b);

输入的数据之间可以是空格、制表符、回车符,也可以三者混合。(这里就是用到了这个特点)

 void Print(LinkList polynomial)
 {
 	LinkList r;
 	r = polynomial -> Next;
 	
 	while (r)
 	{
 		if(r -> Next != NULL)  //解决了最后一项后面还加符号的问题
            cout<< r -> Base_number <<"x"<<"^"<< r -> Index_number <<"+";
        else
            cout<<r -> Base_number <<"x"<<"^"<<r -> Index_number;
        r = r-> Next;

	 }
  } 
void Attach(int x, int y, LinkList *p) //传递的是p的指针,p也是指针,最后传递的是指针的指针,这么做是因为c语言是函数值传递
{
	LinkList q;
	q = new LNode; //新生成一个节点q,来存一项多项式
	
	q -> Base_number = x;
	q -> Index_number =y;
	q -> Next =NULL;
	
	(*p) -> Next = q;   //新生成的结点q插到p的后面
	*p = q;
}
LinkList add(LinkList p1, LinkList p2) //这是最关键的函数
{
	LinkList front,rear,temp;
	int sum;
	int Compare(int x, int y);
	rear = new LNode;
	front = rear;
	
	while(p1 != NULL && p2 != NULL)
	{
		switch (Compare(p1 -> Index_number , p2 -> Index_number)) //使用switch分支判断不同的情况
		{
			case 1 :
				Attach (p1 -> Base_number, p1 -> Index_number, &rear); //这里&rear中的&是取地址运算符,将rear的地址传递进去,可以改变rear的值。
				p1 = p1 -> Next;
				break;
			
			case 0 :
				sum =p1 -> Base_number + p2 -> Base_number;
				if (sum != 0) Attach(sum, p1 -> Index_number, &rear);
				p1 = p1 -> Next;
				p2 = p2 -> Next;
				break;
			
			case -1 :
				Attach (p2 -> Base_number, p2 -> Index_number, &rear);
				p2 = p2 -> Next;
				break;
				
		}
	}
	//出while循环后,如果p1或者p2还有项,则应该直接输出
	for (; p1; p1 = p1 -> Next) Attach(p1 -> Base_number, p1 -> Index_number, &rear);
	
	for (; p2; p2 = p2 -> Next) Attach(p2 -> Base_number, p2 -> Index_number, &rear);
	
	rear -> Next = NULL;
	temp = front;
	front = front -> Next;
	delete (temp);
	return front;
 } 

下面是完整代码

#include <iostream>
using namespace std;


typedef struct LNode
{
   int Base_number;
   int Index_number;
   
   struct LNode *Next;
   
}LNode,*LinkList;




// 创建单链表储存多项式
void Creat(LinkList &polynomial) 
{
   int base,index;

   LinkList p,q;
   
   polynomial = new LNode;
    
   polynomial -> Next = NULL;
   
   p = polynomial;
   
   cout <<"输入项式,按(0,0)结束";
   int x,y;
   
   cin >> x >>y;               
    
   while (x!= 0 || y != 0)
   {
   	q = new LNode;
   	
       q -> Base_number = x;
       q -> Index_number = y;
       q -> Next = NULL;
       
       p -> Next = q;
       p = q;
       
       cin >> x >>y;
   	
   }
} 


//输出多项式,将最终的多项式进行输出
void Print(LinkList polynomial)
{
	LinkList r;
	r = polynomial -> Next;
	
	while (r)
	{
		if(r -> Next != NULL)
           cout<< r -> Base_number <<"x"<<"^"<< r -> Index_number <<"+";
       else
           cout<<r -> Base_number <<"x"<<"^"<<r -> Index_number;
       r = r-> Next;

    }
 } 
 
 
 
int Compare(int x, int y) //用来比较指数的大小 
{
 	if (x > y) return 1;
 	if (x == y) return 0;
 	if(x < y) return -1;
}
 
void Attach(int x, int y, LinkList *p)
{
   LinkList q;
   q = new LNode;
   
   q -> Base_number = x;
   q -> Index_number =y;
   q -> Next =NULL;
   
   (*p) -> Next = q;
   *p = q;
}
 
 
 
LinkList add(LinkList p1, LinkList p2)
{
   LinkList front,rear,temp;
   int sum;
   int Compare(int x, int y);
   rear = new LNode;
   front = rear;
   while(p1 != NULL && p2 != NULL)
   {
   	switch (Compare(p1 -> Index_number , p2 -> Index_number))
   	{
   		case 1 :
   			Attach (p1 -> Base_number, p1 -> Index_number, &rear);
   			p1 = p1 -> Next;
   			break;
   		
   		case 0 :
   			sum =p1 -> Base_number + p2 -> Base_number;
   			if (sum != 0) Attach(sum, p1 -> Index_number, &rear);
   			p1 = p1 -> Next;
   			p2 = p2 -> Next;
   			break;
   		
   		case -1 :
   			Attach (p2 -> Base_number, p2 -> Index_number, &rear);
   			p2 = p2 -> Next;
   			break;
   			
   	}
   }
   for (; p1; p1 = p1 -> Next) Attach(p1 -> Base_number, p1 -> Index_number, &rear);
   
   for (; p2; p2 = p2 -> Next) Attach(p2 -> Base_number, p2 -> Index_number, &rear);
   
   rear -> Next = NULL;
   temp = front;
   front = front -> Next;
   delete (temp);
   return front;
} 


int main()
{
	LinkList p,p1,p2; //p用来保存最后输出的多项式,p1p2分别保存输入的两个多项式
   
   
   void Creat(LinkList &polynomial);
   void Print(LinkList polynomial);
   int Conmpare(int x, int y);
   void Attach(int x, int y, LinkList *p);
   LinkList add(LinkList p1, LinkList p2);
   
   Creat(p1);
   Creat(p2);
   
   p = add(p1, p2);
   
   Print(p);
   
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值