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

一元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;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单计算器的设计与实现 2.4 代码部分 #include #include #define TRUE 1 #define FALSE 0 #define MAXNUM 100 typedef int DataType; struct SeqStack { DataType s[MAXNUM]; int t; }; typedef struct SeqStack *PSeqStack; PSeqStack createEmptyStack_seq() { PSeqStack pastack; pastack=(PSeqStack)malloc(sizeof(struct SeqStack)); if (pastack==NULL) { printf("超出空间!!\n"); } else { pastack->t=-1; } return pastack; } int isEmptyStack_seq(PSeqStack pastack) { return pastack->t==-1; } void push_seq(PSeqStack pastack, DataType x) { if (pastack->t >= MAXNUM - 1) printf("溢出!\n"); else { pastack->t = pastack->t+1; pastack->s[pastack->t]=x; } } void pop_seq(PSeqStack pastack) { if (pastack->t==-1) { printf("未溢出!\n"); } else { pastack->t = pastack->t-1; } } DataType top_seq(PSeqStack pastack) { return pastack->s[pastack->t]; } int infixtoSuffix(const char* infix, char* suffix) { /*将中缀表达式转换为后缀表达式,顺利转换返回true,若转换过程中发现中缀表达式非法则返回false*/ int state_int = FALSE; /*state_int记录状态,等于true表示刚读入的是数字字符,等于false表示刚读入的不是数字字符, 设置这个变量是为了在每输出一个整数后输出一个空格,以免连续输出的两个整数混在一起。*/ char c, c2; PSeqStack ps = createEmptyStack_seq(); /*运算符栈*/ int i, j = 0; if(infix[0]=='\0') { return FALSE; /*不允许出现空表达式*/ } for(i=0; infix[i]!='\0';i++) { c=infix[i]; switch(c) { case ' ': case '\t': case '\n': if(state_int== TRUE) { suffix[j++]=' ';/*状态从true转换为false时输出一个空格*/ } state_int= FALSE; break; /*遇到空格或制表符忽略*/ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': state_int =TRUE; suffix[j++]=c; /*遇到数字输出*/
#include <iostream> //#include"book.h" #include "string" using namespace std; #define Null 0 #define MAX 5 //图书结构体 typedef struct Book { char Bookname[20];//图书名称 char BookID[10]; //图书编号 float Price; //图书价格 char Author[5]; //作者 int Number; //图书数量 struct Book * struct Book *next; }Book; //会员结构体 typedef struct VIP { char VIPname[10]; char Sex[2]; char Xuehao[5]; char BookID[MAX][10]; struct VIP *next; }VIP; //book *Cusrear; //Replace *Reprear; void BookInsert(Book *head)//录入图书基本信息 { Book *p; int i=0; while (i!=1) { p=new Book; cout<<"请输入图书名称:"<<endl; cin>>p->Bookname; cout<<"请输入图书编号:"<<endl; cin>>p->BookID; cout<<"请输入价格:"<<endl; cin>>p->Price; cout<<"请输入作者名称:"<<endl; cin>>p->Author; cout<<"请输入图书数量:"<<endl; cin>>p->Number; p->next=head->next; head->next=p; cout<<"1、返回主菜单 2、继续"<<endl; cin>>i; //rear->next=p;// 利用尾指针便于图书的添加 //rear=p; //rear->next=Null; } } void BookSearch(Book *head)//查询图书 { Book *p; char Bookname[20]; int i=0; while (i!=1) {cout<<"请输入需要查询的图书名称:"<<endl; cin>>Bookname; p=head; while(p&&strcmp(p->Bookname,Bookname)) { p=p->next; } if(p==Null) {cout<<"对不起不存在该图书"<<endl;} else {cout<<"图书名称:"<<p->Bookname; cout<<" 图书编号:"<<p->BookID; cout<<" 价格:"<<p->Price; cout<<" 作者名称:"<<p->Author; cout<<" 图书数量:"<<p->Number<<endl;} cout<<"1、返回主菜单 2、继续"<<endl; cin>>i; } } void BookDelete(Book *head) //利用表头指针定位要删除的图书信息 { Book *p,*q; char Bookname[20]; int i=0; while(i!=1) {cout<<"请输入需要删除的图书信息:"<<endl; cin>>Bookname; p=head; while(p->next&&strcmp(p->next->Bookname,Bookname)) {p=p->next;} q=p->next; if(q!=Null) { // if(q->next==Null) // {rear=p;} p->next=p->next->next; delete q;} else {cout<<"你所要删除的图书不存在"<<endl;} cout<<"1、退出 2、继续"<<endl; cin>>i; } } void NEWVIP(VIP *head) { VIP *p; int i=0; while (i!=1) { p=new VIP; cout<<"请输入您的会员名称:"<<endl; cin>>p->VIPname; cout<<"请输入您的会员性别:"<<endl; cin>>p->Sex; cout<<"请输入您的会员学号:"<<endl; cin>>p->Xuehao; cout<<"恭喜您注册成功!"<<endl; p->next=head->next; head->next=p; cout<<"1、返回主菜单 "<<endl; cin>>i; } } void BBook(Book *head)//借书函数 { int Book_Amount; Book *p; char Bookname[10]; int i=2; while(i!=1) {cout<<"请输入图书名称:"<<endl; cin>>Bookname; p=head; while(p&&strcmp(p->Bookname,Bookname)) {p=p->next; } if (p==Null) {cout<<"对不起不存在此图书"<<endl;} else {while(i!=1) {cout<<"输入需要借阅的数量"<<endl; cin>>Book_Amount; while(Book_Amount==0) { cout<<"请输入一个非零数"<<endl; cin>>Book_Amount; } if(Book_Amount<=p->Number) {cout<<"借书成功!"<<endl;} else { cout<<"库存量小于借阅数量,借书失败!"<<endl; } cout<<"1、返回菜单 2、继续"<<endl; cin>>i; } } } } void Borrowbook(VIP *head)//借书 { VIP *p; char VIPname[10],Bookname[20]; int i=0; while(i!=1) {cout<<"请输入会员名称:"<<endl; cin>>VIPname; p=head; while(p&&strcmp(p->VIPname,VIPname)) { p=p->next; } if (p!=Null) { void BBook(Book *head); } else { cout<<" 对不起您不是会员"<<endl; cout<<" 注册成为会员"<<endl; NEWVIP(head); } } } void Returnbook(Book *head)//还书 { Book *q; VIP *p; char Bookname[20]; char VIPname[10]; int i=0; while(i!=1) { cout<<"请输入会员名:"<<endl; cin>>VIPname; p=head; while(p&&strcmp(p->VIPname,VIPname)) { p=p->next; } if(p==NULL) {cout<<"请输入正确的会员名!!"<<endl;} else { while(i!=2) {cout<<"请输入还书名:"<<endl; cin>>Bookname; q=head; while(q&&strcmp(q->Bookname,Bookname)) {q=q->next;} { q->Number+=Number; } } void main() { Book *head,*rear; VIP *L; L=new VIP; L->next=Null; head=rear=new Book; head->next=Null; rear->next=Null; char i='0'; while(i!='7') { cout<<"********图书管理系统*********"<<endl; cout<<"1、录入图书基本信息 5、还书"<<endl; cout<<"2、图书基本信息查询 6、统计图书库存和已借图书数量"<<endl; cout<<"3、删除图书基本信息 7、退出系统"<<endl; cout<<"4、图书借阅"<<endl; cout<<"*****************************"<<endl; cin>>i; switch(i) {case '1': BookInsert(head );break; case '2': BookSearch(head);break; case '3': BookDelete(head);break; case '4': Borrowbook(L);break; case '5': Returnbook(head);break; case '6': FlightCancelTicket(head);break; case '7':break; default:cout<<"error\n";break; } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值