0

私はリンクされたリストの初心者なので、このコードで私を助けてくれれば非常に感謝しています。これまでのところ、私の最初の問題の下に書かれているのは、どのように私のボイドを呼び出してテキストドキュメントをソートすることができるかということです(下記参照) ) sort void を書きましたが、リンクされたリストにアクセスするために適切に書き込む方法がわかりません...

  ***1stName lastname number email bday***
  Nikos Nikolas 281085252 niko@hotmail.com 21/10/1995
  mary ann 2810258963 mary@hotmail.com 22/10/1995
  james bond 2810254789 james@hotmail.com 23/11/2000
  luna loop 2810258741 luna@hotmail.com 24/04/1990


 #include <iostream>
   #include <fstream>
   #include <string>
   #define TRUE 1
   using namespace std;


   struct organizer
   {
       string first_name;
       string last_name;
       int number;
       string email;
       string bday;
       organizer* next;
   };
   int main()
   {
      void sort_by_last(organizer* head_ptr);
      char command;
      ifstream inFile;
      inFile.open("mycontacts.txt");
      if (!inFile)
      {
          cerr << "Unable to open file." << endl;
          return 0;
      }
      organizer* temp = new organizer;
      organizer* head_ptr = temp;

      while(inFile)
      {
         inFile >> temp->first_name;
         inFile >> temp->last_name;
         inFile >> temp->number;
         inFile >> temp->email;
         inFile >> temp->bday;
         temp->next = new organizer;
         temp = temp->next;
      }
      temp->next = NULL;
      while (TRUE)
      {
          cout << "Write 'print' To print mycontacts." << '\n';
          cout << "Write 'find' '..'to search myconacts."<< '\n';
          cout << "Write 'delete' 'name'to delete a contact."<< '\n';
          cout << "Write 'insert' 'details' to add a contact."<< '\n';
          cout << "Write 'quit' to exit the programm."<< '\n';
          command = getchar();
          switch(command)
            {
            case 'p':
                    sort_by_last(organizer);
                    break;
            case 'f':
                    cout << "search and print\n"; break;
            case 'd':
                    cout << "delete\n";break;
            case 'i':
                    cout << "insert\n";break;
            case 'q':
                    cout << "Quitin programm.\n";
                    return 0;
            }
        }
        return 0;
        }
        void  sort_by_last(organizer* head_ptr)
         {
          organizer* node = head_ptr;
          organizer* temp = NULL;

          while (node->next != NULL)
            {
               if(node->last_name > node->next->last_name)
               {
                  temp = node;
                  node = node->next;
                  temp->next = node;
                  node = temp;
                }
            }
        }
4

1 に答える 1

0

を使用せずstructclass代わりに使用してください。

class Organizer
{
   Organizer() { next = NULL; };
   string first_name;
   string last_name;
   int number;
   string email;
   string bday;
   Organizer* next;
   bool operator <(const Organizer &other)
   { return last_name.compare(other.last_name) == -1; };
};

string が をサポートしているとは思わない<ので、代わりに比較を使用しました。

二重リンクではなく単一リンクリストしかないため(next変数のみでありprevious、同様ではない)、並べ替えには を使用する**か、比較->next->next->nextて空白のヘッドアイテムを作成する必要があります。

sort_by_last(organizer);に変更sort_by_last(&head_ptr);

並べ替え関数は次のようになります (挿入並べ替えを実行すると仮定します。これは遅いですが単純です): (未テスト)

void sort_by_last(Organizer **head_ptr)
{
   Organizer **node = head_ptr;

   while (*node != NULL)
   {
      Organizer **temp = head_ptr;
      Organizer **next = &(*node)->next;
      while (*temp != NULL && **temp < **node)
         temp = &(*temp)->next;
      if (*temp != NULL && *temp != *node)
      {
         (*node)->next = *temp;
         (*temp)->next = (*node)->next;
         *temp = *node; // same as (*temp)->prev->next = *node
         *node = NULL; // so we don't point back to earlier in the list
      }
      node = next;
   }
}

リンクリストを使用する必要があると思いますが、std::set の方がはるかに簡単なソリューションです (挿入時にソートされます)。

#include <set>
std::set<Organizer> theSet;
...
Organizer organizer;
// set up organizer
theSet.insert(organizer);
于 2012-12-27T11:32:28.203 に答える