数据结构——一元n次多项式加法
生活随笔
收集整理的這篇文章主要介紹了
数据结构——一元n次多项式加法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
此為本人在學習數據結構時所寫的,各個功能能夠實現,有main.cpp,link.h,list.h,list.cpp四個文件
使用說明:
請按照輸入提示輸入多項式的次數和各項系數,;
輸入請按照提示要求!
請不要輸入數字之外的其他文字
例:
3
3 2
2 3
1 1
0 0
表示最高級數為3的多項式:2x3+3x2+1*x1+0x0
5
5 1
0 0
表示最高級數為5的多項式:1x^5
main.cpp文件
link.h文件
#ifndef LINK_H #define LINK_H #include <stdlib.h> struct elem{//數據結構類型 int zhishu;//指數 int xishu;//系數 }; class link{public:elem element;//結點值 link *next;//結點指針link(const elem &elemval, link*nextval=NULL){//構造函數,用來新建 element.zhishu=elemval.zhishu;element.xishu=elemval.xishu;next=nextval;} link(link*nextval=NULL){//構造函數 next=nextval;} };#endiflist.h文件
#include "link.h" #include <iostream> #include <iomanip> #include <stdlib.h> #include <assert.h> #ifndef LIST_H #define LIST_H using namespace std; class list: public link{private:link*head;//頭結點 link*tail;//尾結點 link*curr;//當前元素int cut;//當前鏈表大小void init(){curr=tail=head=new link;cut=0;} void removeall(){while(head!=NULL){curr=head;head=head->next;delete curr;}}public:list(int size=100){init();}//構造函數最大值為100 ~list(){removeall();}//析構函數 void print();//打印函數 void tihuan(int i,elem &it);//將i位置的數據值替換為it void clear();//清空列表 void paixu();//對線性表進行排序 void insert(const elem&it);//在當前插入it void append(const elem&it);//在列表的尾部追加itelem remove();//將當前值刪除 void movetostart();//將curr設置在鏈表頭部void movetoend();//將curr設置在鏈表尾部 void prev();//curr向前一步 void next();//curr向后一步 int length();//返回當前鏈表長度 int currpos();//返回當前curr的值 void movetopos(int pos);//將curr移到指定位置 const elem& getvalue();//返回當前鏈表數據 list xiangjia(list &a);//進行兩個鏈表相加的操作 };#endiflist.cpp文件
#include "list.h" #include <assert.h> void list::print(){//打印函數 int n=length();movetopos(0);elem it=getvalue();if(it.xishu!=0){cout<<it.xishu<<"*x^"<<it.zhishu;}for(int i=1;i<n;i++){//n次循環 movetopos(i);//移動到指定的i位置 elem it=getvalue();//新建一個數據值將數據保存 if(it.xishu!=0){cout<<"+"<<it.xishu<<"*x^"<<it.zhishu;} } cout<<endl; } void list::tihuan(int i,elem &it){//替換函數,將i位置的數據值替換為it movetopos(i);//移動到第i個位置 curr->next->element.zhishu=it.zhishu;//進行替換 curr->next->element.xishu=it.xishu; } void list::clear(){//初始化函數 removeall();init(); } void list::paixu(){//排序函數,將鏈表按照數據對象中的指數由大到小排列 int n=length();elem ii,jj;for(int i=0;i<n;i++){//冒泡排序 for(int j=i;j<n;j++){movetopos(i);ii=getvalue();movetopos(j);jj=getvalue();if(ii.zhishu<jj.zhishu){tihuan(i,jj);tihuan(j,ii);}}} } void list::insert(const elem&it){//插入函數 curr->next = new link(it, curr->next); if (tail == curr) tail = curr->next; // 新的尾指針 cut++; } void list::append(const elem & it){//在隊尾插入 tail=tail->next=new link(it,NULL);cut++; } elem list::remove(){//刪除函數 assert(curr->next!=NULL);elem it;it.xishu=curr->next->element.xishu;it.zhishu=curr->next->element.zhishu;link* ltemp=curr->next;if(tail==curr->next)tail=curr;curr->next=curr->next->next;delete ltemp;cut--;return it; } void list::movetostart(){//移動到開頭 curr=head; } void list::movetoend(){//移動到結尾 curr=tail; } void list::prev(){//向前 if(curr==head)return;link* temp=head;while(temp->next!=curr)temp=temp->next;curr=temp; } void list::next(){//向后 if(curr!=tail)curr=curr->next; } int list::length(){//求當前線性表的長度 return cut; } int list::currpos(){//返回當前位置link* temp=head;int i;for(i=0;curr!=temp;i++){temp=temp->next;}return i; } void list::movetopos(int pos){//將當前位置移動到指定的位置 assert((pos>=0)&&(pos<=cut));curr=head;for(int i=0;i<pos;i++){curr=curr->next;} } const elem& list::getvalue(){//得到當前位置的數據對象 assert(curr->next!=NULL);return curr->next->element; } list list::xiangjia(list &a){//實現兩個函數的相加 list c;elem n;int x=0,y=0,max;movetostart();//由于是有序線性表,第一個數據的指數項就是最大指數 x=getvalue().zhishu;//得到第一個線性表中最大的指數 a.movetostart();y=a.getvalue().zhishu;//得到第二個線性表中最大的指數 if(x>y){//通過比較,找到兩個線性表中最大的指數,賦值給max整型變量 max=x;}else{max=y;}for(int i=max;i>=0;i--){//從最大的指數開始,依次在兩個線性表中查找有無對應的項 n.zhishu=i;n.xishu=0;for(int j=0;j<length();j++){//在第一個線性表中進行查找,終止條件是到最后一個 movetopos(j);if(getvalue().zhishu==i){//如果某一項的指數與當前查找的指數相等 n.xishu=getvalue().xishu;//將當前項的系數賦值給n的系數 break;//跳出循環 }} for(int j=0;j<a.length();j++){//在第二個線性表中進行查找,終止條件為到最后一個 a.movetopos(j);if(a.getvalue().zhishu==i){//如果某一項的指數與當前查找的指數相等 n.xishu=n.xishu+a.getvalue().xishu;//將當前項的系數與n的系數相加后賦值給n的系數 break;//跳出循環 }} c.append(n);}return c; } /* if(x>y){//如果第一個比第二個長 for(int i=0;i<x-y;i++){//將長的部分直接放到新的鏈線性表中 n=getvalue();c.append(n);curr=curr->next;}for(int i=0;i<y;i++){//將剩余部分相加之后放到新的線性表中 n.xishu=getvalue().xishu+a.getvalue().xishu;n.zhishu=getvalue().zhishu+a.getvalue().zhishu;c.append(n);curr=curr->next;a.next();}}else{//如果第二個比第一個長,同理 for(int i=0;i<y-x;i++){n=a.getvalue();c.append(n);a.next();}for(int i=0;i<x;i++){n.xishu=getvalue().xishu+a.getvalue().xishu;n.zhishu=getvalue().zhishu+a.getvalue().zhishu;c.append(n);curr=curr->next;a.next();}}c.print();//將得到的線性表打印*/總結
以上是生活随笔為你收集整理的数据结构——一元n次多项式加法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情歌-吉他谱
- 下一篇: swagger2 description