リンクされたリストで、各ノードを他のノードと比較し、用語が似ている場合はそれらを追加します。リンクされたリストを調べてから追加するのに問題があります。
私のmain.cpp:
#include <cstdlib>
#include "list.h"
int main(){
Poly poly=new_list();
Poly poly2=new_list();
Poly merged= new_list();
int n;
int deg;
float coef;
n=1;
while (n==1)
{
cout<<"Enter coefficient ";
cin>> coef;
cout<<"Enter degree ";
cin>>deg;
insert_front(&poly,coef,deg);
cout<<"Enter 1 to continue or 0 to break ";
cin>>n;
}
print_list(poly);
cout<<"sorted\n";
reduce(poly);
}
これは私のヘッダーファイルです:
//list.h
#include <iostream>
using namespace std;
#ifndef LIST_H
#define LIST_H
struct Term {
int deg;
float coef;
Term *next;
};
typedef Term* Poly;
Poly new_list();
void insert_front(Poly* ppoly,int deg, float coef);
void print_list(Poly poly);
void delete_front(Poly* ppoly);
bool is_empty(Poly poly);
Poly merge(Poly *ppoly,Poly *ppoly2);
void split_list(Poly* ppoly,Poly *ppoly2);
void mergesort(Poly* pl);
void reduce(Poly poly);
#endif
そして、ユーザーの係数と多項式の次数を入れて出力し、それらを最低次数から最高次数にマージソートするすべての関数があります。
機能:
list.cpp
#include "list.h" Poly new_list(){ Poly poly = 0; ポリゴンを返します。} void insert_front(Poly* ppoly,int deg, float coef){ Term* t; t = 新しい項。t->係数=係数; t->度 = 度; t->next = *ppoly; *ppoly = t; 戻る; } void print_list(Poly poly){ 項* p; p = ポリ; if(p == 0) cout << "--- 空のリスト ---"; while(p !=0){ cout << p->deg<<"x^"<coef<<" + "; p = p->次; } cout << endl; } void delete_front(Poly* ppoly){ Term* t; if( !is_empty(*ppoly) ){ // リストは空ではありません
t = (*ppoly); *ppoly = (*ppoly)->next; t を削除します。} }
bool is_empty(Poly poly){
return (poly == 0); //return true if list empty
}
Poly merge(Poly* ppoly, Poly* ppoly2){
Term **pp;
Poly merged, list1,list2;
merged= new_list();
list1 = *ppoly;
list2 = *ppoly2;
pp= &merged;
while(list1 != NULL && list2 != NULL){
if(list2->coef > list1->coef){
*pp = list1;
list1 = list1->next;
(*pp)->next = NULL;
}else{
*pp = list2;
list2 = list2->next;
(*pp)->next = NULL;
}
pp = &( (*pp)->next );
}
if(list1 != NULL)
*pp = list1;
if(list2 != NULL)
*pp = list2;
*ppoly = NULL;
*ppoly2 = NULL;
return merged;
}
void split_list(Poly* ppoly, Poly* ppoly2){
Poly l1= *ppoly;
Poly l2= *ppoly;
Poly* pp = &l1;
while( l2 != NULL){
l2 = l2->next;
if(l2 != NULL){
l2 = l2->next;
pp = &((*pp)->next);
}
}
l2 = *pp;
(*pp) = NULL;
*ppoly=l1;
*ppoly2=l2;
}
void mergesort(Poly* pl){
Poly l1 = *pl;
Poly l2 = new_list();
Poly merged = new_list();
if(l1 == NULL || l1->next == NULL)
return; //sorted or empty
split_list(&l1,&l2);
mergesort(&l1);
mergesort(&l2);
merged = merge(&l1,&l2);
*pl = merged;
}
void reduce(Poly poly){
mergesort(&poly);
print_list(poly);
int i=0;
cout<<"combining like terms:"<<endl;
Term* p;
p=poly;
if (p==0)
cout<<"---empty list---";
while(i=0){
if (poly->coef==(poly->next)->coef){
p->deg=(poly->deg)+((poly->next)->deg);
poly=p;
i=1;
}
}
print_list(poly);
}
私はこれを数日間行ってきましたが、これを機能させることができません。問題はreduce()
関数にあります。
たとえば、私が持っている場合: 2x^2+2x^2+4x^2+3x^5
、それは印刷されます8x^2+3x^5
。