0

私は最近 26array を作成し、辞書をシミュレートしようとしました。

私はこれを作る方法を理解できないようです。文字列の代わりにintのリンクリストを渡して作業しようとしました。私の現在のコードは 26 個のノード (az) を作成し、それらの各ノードには 26 個のノード (az) があります。これをintで行う方法、たとえば(1-26)を実装したいと思います。これらの int ノードは項目を表し、渡したい int のリンクリストには、文字列のようにツリーで表現したい一連の int が含まれます。

例: 「hello」などの文字列の代わりに、セット {1, 6 , 8} を渡します

   #include <iostream>
using namespace std;

class N26
{
   private:
       struct N26Node 
        {
          bool isEnd;
          struct N26Node *children[26];
        }*head;

   public:
      N26();
      ~N26();

      void insert(string word);
      bool isExists(string word);
      void printPath(char searchKey);
};
N26::N26()
{
    head = new N26Node();
    head->isEnd = false;
}
N26::~N26()
{
}

void N26::insert(string word)
{
   N26Node *current = head;
   for(int i = 0; i < word.length(); i++)
   {
       int letter = (int)word[i] - (int)'a';

       if(current->children[letter] == NULL)
       {
           current->children[letter] = new N26Node();
       }
       current = current->children[letter];
   }
   current->isEnd = true;

}

/*      Pre:  A search key
 *     Post:  True is the search key is found in the tree, otherwise false
 *  Purpose:  To determine if a give data exists in the tree or not
 ******************************************************************************/

bool N26::isExists(string word)
{
    N26Node *current = head;
    for(int i=0; i<word.length(); i++)
    {
        if(current->children[((int)word[i]-(int)'a')] == NULL)
        {
            return false;
        }
        current = current->children[((int)word[i]-(int)'a')];
    }
    return current->isEnd;

}
4

2 に答える 2

1
class N26
{
  private:
    N26Node newNode(void);
    N26Node *mRootNode;
  ...    
};

N26Node *newNode(void)
{
  N26Node *mRootNode = new N26Node;
  mRootNode = NULL;
  mRootNode->mData = NULL;

  for ( int i = 0; i < 26; i++ )
    mRootNode->mAlphabet[i] = NULL;
  return mRootNode;
}

ああ!私の目!

真剣に、あなたはあまりにも高度なことを試みています。あなたのコードはバグだらけで、意図したとおりに動作しません。いじくり回しても役に立ちません。ポインタとリンク リストの基本に戻る必要があります。上記のコードの何が問題なのかを理解するまでは、基本を学び、連結リストの連結リストのようなことを試みないでください。

「メモリ リーク」、「ダングリング ポインタ」、「型の不一致」、「未定義の動作」などのヒントをいくつか紹介します。

于 2012-12-12T17:11:59.093 に答える
0

リンクされたリストはあまり使用しませんでしたが、配列を使用して機能させることができました。

/* ***  Author:       Jamie Roland
     *  Class:        CSI 281
     *  Institute:    Champlain College
     *  Last Update:  October 31, 2012
     *
     *  Description:
     *      This class is to implement an n26 trie.  The 
     *  operations
     *  available for this impementation are:
     *  
      *  1.  insert
     *  2.  isEmpty
      *  3.  isExists
     *  4.  remove
     *  5.  showInOrder
     *  6.  showPreOrder
     *  7.  showPostOrder
     *
     *  Certification of Authenticity:  
     *     I certify that this assignment is entirely my own work.
     **********************************************************************/
#include <iostream>
using namespace std;

class N26
{
   private:
       struct N26Node 
        {
          bool isEnd;
          struct N26Node *children[26];
        }*head;

   public:
      N26();
      ~N26();

      void insert(int word[]);
      bool isExists(int word[]);
      void printPath(char searchKey);
};
N26::N26()
{
    head = new N26Node();
    head->isEnd = false;
}
N26::~N26()
{
}

void N26::insert(int word[])
{
    int size = sizeof word/sizeof(int);
   N26Node *current = head;
   for(int i = 0; i < size; i++)
   {
       int letter = word[i] - 1;

       if(current->children[letter] == NULL)
       {
           current->children[letter] = new N26Node();
       }
       current = current->children[letter];
   }
   current->isEnd = true;

}

/*      Pre:  A search key
 *     Post:  True is the search key is found in the tree, otherwise false
 *  Purpose:  To determine if a give data exists in the tree or not
 ******************************************************************************/

bool N26::isExists(int word[])
{
    int size = sizeof word/sizeof(int);
    N26Node *current = head;
    for(int i=0; i<size; i++)
    {
        if(current->children[(word[i]-1)] == NULL)
        {
            return false;
        }
        current = current->children[(word[i]-1)];
    }
    return current->isEnd;

}
于 2012-12-13T00:51:30.603 に答える