2017-12-08 11 views
-2

に、私はクイックソートのアルゴリズムで最後の名前でリストをソートしたいが、それは動作しません要素を交換するとき、彼らはこの値の一部ではクイックソートアルゴリズム二重にリンクされたリスト

あったように、それは彼らの葉チェーンが交換されます

void swap(string* a, string* b){ 


cout<<"A and B are "<<*a<<" - "<<*b<<endl; 

string t = *a; 
*a = *b; 
cout<<" A is ->"<<*a<<endl; 

*b= t; 
cout<<"B is ->"<<*b<<endl; 

} 

これはパーティションが作成される場所です。私は、* iと* jが値をとるとき、それらはまったく同じ名前なので、後で比較することはできないことに気付きました。このリストが数字の場合には動作するのは奇妙に思えますが、文字列の場合はこのエラーが発生します。

User *i = lower; 

しかし、これは、プログラムがクラッシュしたので、最後に動作していますが、文字列の値を変更した場合

User* partition(User *lower, User *high){ 

cout<<"Lower -> "<<lower->lastname<<endl; 
cout<<"High -> "<<high->lastname<<endl; 
string pivot = high->lastname; 
User *i = bajo->prev; 
for (User *j = lower; j != high; j = j->next) 
{ 
    if (j->lastname.compare(pivot)< 0) 
    { 
     i = (i == NULL)? lower : i->next; 
     cout<<"Atention J e I valen ->"<<i->lastname<<" - "<<j->lastname<<endl; 
     swap(&(i->lastname), &(j->lastname)); 
    } 
} 
i = (i == NULL)? lower : i->lastname; // Similar to i++ 
swap(&(i->lastname), &(alto->lastname)); 
return i; 
} 

私は何を失敗していませんでしたか?どうすればそれが本当に望ましい価値を持つことができますか?

EDITED:

これは、ソースコード

#include <iostream> 
#include<iomanip> 
#include <string> 
#include<cstdlib> 

using namespace std; 

class User 
{ 

public : 
    string lastname; 
    User *next; 
    User *prev; 
    User() 
    { 
     lastname= ""; 
     next=NULL; 
     prev=NULL; 

    } 
    int empty(User *listt) 
    { 

     if(listt == NULL) 
     { 

      return 1; 
     } 
     else 
     { 

      return 0; 
     } 

    } 


    User *Insert(User *listt, string lastName) 
    { 

     User *temp = new User(); 

     if(empty(listt)) 
     { 

      temp->lastname=lastName; 
      listt = temp; 

     } 
     else 
     { 

      temp->lastname=lastName; 
      listt->prev=temp; 
      temp->next=listt; 
      listt=temp; 

     } 
     return listt; 
    } 
    void swap(string* a, string* b) 
    { 

     string t = *a; 
     *a = *b; 

     *b= t; 

    } 
    User* partition(User* lower, User* high) 
    { 

     cout<<"Lower -> "<<lower->lastname<<endl; 
     cout<<"High -> "<<high->lastname<<endl; 
     string pivot = high->lastname; 
     User *i = lower->prev; 
     for (User *j = lower; j != high; j = j->next) 
     { 
      if (j->lastname.compare(pivot)< 0) 
      { 
       i = (i == NULL)? lower : i->next; 
       swap(&(i->lastname), &(j->lastname)); 
      } 
     } 
     i = (i == NULL)? lower : i->next; // Similar to i++ 
     swap(&(i->lastname), &(high->lastname)); 
     return i; 
    } 
    User *Last(User *listt) 
    { 
     User *temp = listt; 

     while(temp && temp ->next) 
      temp=temp->next; 
     return temp; 


    } 
    void _quickSort(User* lower, User* high) 
    { 

     if(high != NULL && lower != high&&lower!= high->next) 
     { 
      User *p = partition(lower,high); 
      _quickSort(lower,p->next); //I change this part 
      _quickSort(p->next,high); 

     } 

    } 
    void quickSort(User *listt) 
    { 
     User *h = Last(listt); 

     _quickSort(listt, h); 


    } 
    User *Display(User *listt) 
    { 

     if(empty(listt)) 
     { 

      cout<<"List empty"<<endl; 

     } 
     else 
     { 

      User *temp = new User(); 
      temp = listt; 
      while(temp!= NULL) 
      { 

       cout<<"The last name is -> "<<temp->lastname<<endl; 
       temp=temp->next; 
      } 

     } 
     return listt; 


    } 
}; 

int main() 
{ 

    User *listt = NULL; 
    User y; 
    bool exit = false; 
    int opc; 
    string lastName; 
    while(!exit) 
    { 

     cout<<"1.-Insert an element"<<endl; 
     cout<<"2.-Sort element-(Quicksort)"<<endl; 
     cout<<"3.-Show elements"<<endl; 
     cout<<"4.-Exitt"<<endl; 
     cin>>opc; 
     switch(opc) 
     { 
     case 1: 
      cout<<"Inser your last name"<<endl; 
      cin>>lastName; 
      listt=y.Insert(listt,lastName); 
      system("pause"); 
      system("cls"); 
      break; 
     case 2: 
      cout<<"Sorting...."<<endl; 
      y.quickSort(listt); 
      system("pause"); 
      system("cls"); 
      break; 
     case 3: 
      cout<<"Display..."<<endl; 
      y.Display(listt); 
      system("pause"); 
      system("cls"); 
      break; 
     case 4: 
      exit = true; 
      break; 



     } 




    } 




} 
+0

はStackOverflowのへようこそ。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。 – Prune

+0

[OK]を、おかげで私は、これらの生のポインタはかなりの誤差傾向がある私のポスト –

+0

を変更し、すでにかなりよく標準ライブラリに行われているものを複製します。予期せぬ場所でクラッシュするという事実は、そのエラーが他の場所にあることを示しています。ここで非実行コードのいくつかのスニペットを投稿することは、本当の原因を明らかにする可能性は低いです。 –

答えて

0
_quickSort(lower,p->next); //I change this part 

上のリファレンスを参照してください、あなたのクイックソートの実装を確認したいことがあります。正しい関数:

void _quickSort(User* lower, User* high) 
{ 
    if(high != NULL && lower != high&&lower != high->next) 
    { 
     User *p = partition(lower, high); 
     _quickSort(lower, p->prev); //change it back! 
     _quickSort(p->next, high); 
    } 
} 

また、Displayにはリソースリークがあります。表示機能に新しいアイテムを割り当てないでください:

User *Display(User *listt) 
{ 
    if(empty(listt)) 
    { 
     cout<<"List empty"<<endl; 
    } 
    else 
    { 
     //User *temp = new User(); <== don't allocate new item here 
     User *temp = listt; 
     while(temp!= NULL) 
     { 
      cout<<"The last name is -> "<<temp->lastname<<endl; 
      temp=temp->next; 
     } 

    } 
    return listt; 
} 

テスト1000件で:

class User 
{ 
public: 
    class Node 
    { 
    public: 
     string lastname; 
     Node *next; 
     Node *prev; 
     Node() 
     { 
      prev = next = nullptr; 
     } 
    }; 

    Node *head; 
    User() 
    { 
     head = nullptr; 
    } 

    void Insert(string val) 
    { 
     Node *temp = new Node; 
     temp->lastname = val; 
     if (head) 
     { 
      head->prev = temp; 
      temp->next = head; 
     } 
     head = temp; 
    } 

    void swap(string &a, string &b) 
    { 
     string t = a; 
     a = b; 
     b = t; 
    } 

    Node *Tail() 
    { 
     Node *temp = head; 
     while(temp && temp->next) 
      temp = temp->next; 
     return temp; 
    } 

    Node* partition(Node* left, Node* right) 
    { 
     string pivot = right->lastname; 
     Node *i = left->prev; 
     for(Node *j = left; j != right; j = j->next) 
     { 
      if(j->lastname < pivot) 
      { 
       i = (i == nullptr) ? left : i->next; 
       swap(i->lastname, j->lastname); 
      } 
     } 
     i = (i == nullptr) ? left : i->next; // Similar to i++ 
     swap(i->lastname, right->lastname); 
     return i; 
    } 

    void quickSort(Node* left, Node* right) 
    { 
     if(!left || !right || left == right || left == right->next) 
      return; 
     Node *p = partition(left, right); 
     quickSort(left, p->prev); 
     quickSort(p->next, right); 
    } 

    void quickSort() 
    { 
     quickSort(head, Tail()); 
    } 

    void Display() 
    { 
     string last; 
     for (Node *n = head; n; n = n->next) 
     { 
      if(n->lastname < last) 
      { 
       cout << "error ***\n"; 
       break; 
      } 
      last = n->lastname; 
      cout << n->lastname << endl; 
     } 
    } 
}; 

int main() 
{ 
    User list; 

    list.Insert("z"); 
    list.Insert("c"); 
    list.Insert("a"); 
    list.Insert("g"); 

    for(int i = 0; i < 1000; i++) 
    { 
     string str; 
     for (int j = 0; j < 3; j++) 
      str.push_back('a' + rand() % 26); 
     list.Insert(str); 
    } 

    list.quickSort(); 
    list.Display(); 

    return 0; 
} 
+0

数字で動作します。何らかの理由で、しかし文字ではありません。私は 'z c a g 'を使用しようとしており、この方法で' c a g z 'をソートします。このメソッドが正しいかどうかわかりません。 –

+0

編集を参照して、以前のような同じソートルーチンを使用して簡単な形式でクラスを書き直しました。これはあなたのブラウザで正しくソートされています。値。あなたの先生は、クイックソートとリンクリストを並べ替えることを余儀なくされていますか、これはあなた自身のアイデアですか? –

+0

うわー、あなたはそれを解決します。ありがとう、私はすでに私のミスがどこにあるかを見ました。私はあなたが文字列でクイックソートを行うことができるかどうかをチェックしたいと思っていました。 –

1

では、実際にあなたのスワップ機能が働いているように見えるが、あなたはそれを割り当てるべきではありませんので*aは、int型の値として考えられているので、string t = *a;使用量は一種の奇妙ですコンパイラはどちらの方法でも処理できますが、文字列です。一方、私はあなたが言及したことは、「」その後、一時的な文字列にし、それがstring* t = a;として行われるべきで、あなたが代わりに参照することによりその通過の

など、より良い練習がある b = t;を行うことができますの値をコピーすることであると思います
void swap(string &a, string &b){ 
    string t = a; 
    a = b; 
    b= t; 
} 

、あなたはこれがp->prevあるべきthis page

+0

それは素晴らしいと思うけど、私の実装ではうまくいきません –

+0

スワップ((i-> lastname)、(high-> lastname )); – alios

+0

ああ、ありがとう。 –

関連する問題