0

リンクされたリストで、各ノードを他のノードと比較し、用語が似ている場合はそれらを追加します。リンクされたリストを調べてから追加するのに問題があります。

私の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

4

1 に答える 1

1

ここには多くの問題があります。簡単なケースから始めましょう:

int main()
{
  Poly poly=new_list();

  insert_front(&poly,2,5);
  insert_front(&poly,2,5);

  reduce(poly);
  print_list(poly); // we hope for 4x^5

  return(0);
}

...しかし、2x^5を取得します。(可能であれば、関数を分離してテストする必要があることに注意してください。対話性やマージ、またはその他すべてのものは必要ありません。)

今見てくださいreduce

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);
}

あなたは「ceof」と「degree」を間違った方法で持っていますが、それは変数の命名の問題です(私の目を傷つけるものではありますが)。

while(i=0)あなたは私があなたが意味したと思うところを使いますwhile(i==0)。書かれているように、それはに評価される割り当てな0ので、制御がループに入ることはありません。ループに入るように修正するとします。

int i=0;
Term* p;
p=poly;
while(i==0){
  if (poly->coef==(poly->next)->coef){
    p->deg=(poly->deg)+((poly->next)->deg);
    poly=p;
    i=1;
  }
}

最初の2つの項が一致しない場合、iゼロのままであり、ループに永久に残ります。
最初の2つの用語が一致しi=1、ループを離れた場合、他の用語は考慮されません。
ループを終了する前に、最初の項を変更してから、を設定しpoly=pます。しかし、polyすでに等しいp; このステップは何もしません、そして第2項はまだそこにあります。

これであなたが正しい方向に進むのに十分だと思います。

于 2012-10-10T18:04:59.423 に答える