0

これは、リンクされたリストに整数を追加する私のコードです。

#include "iostream"
using namespace std;

class LinkList
{
private:
      struct Node
      {
        int data;
        Node* link;
      }*p;

public:
      LinkList();
      ~LinkList();

       void Print();         // Prints the contents of linkedlist
       void Append(int num); // Adds a new node at the end of the linkedlist
       void Delete(int num); // Deletes the specified node from the linkedlist

       void AddatBeg(int num);// Adds a new node at the beginning of the linkedlist
       void AddAfter(int c, int num); // Adds a new node after specified number of nodes
       int Count();          // Counts number of nodes present in the linkedlist

};

LinkList::LinkList()
{
  p = NULL;
}

LinkList::~LinkList()
{
  if (p == NULL)
        return;

  Node* tmp;
  while(p != NULL)
  {
       tmp = p->link ;
     delete p;
       p = tmp;
  }
}

// Prints the contents of linkedlist
void LinkList::Print()
{
  if (p == NULL)
  {
        cout<< "EMPTY";
        return;
  }

  //Traverse
  Node* tmp = p;
  while(tmp != NULL)
  {
       cout<<tmp->data<<endl;
       tmp = tmp->link ;
  }
}

// Adds a new node at the end of the linkedlist
void LinkList::Append(int num)
{
      Node *newNode;

      newNode = new Node;
      newNode->data = num;
      newNode->link = NULL;

       if(p == NULL)
      {
       //create first node
         p = newNode;
      }
       else
      {
             //Traverse
            Node *tmp = p;
             while(tmp->link != NULL)
            {
                  tmp = tmp->link;
            }

             //add node to the end
        tmp->link = newNode;
      }
}

// Deletes the specified node from the linkedlist
void LinkList::Delete( int num )
{
   Node *tmp;

   tmp = p;
   //If node to be delete is first node
   if( tmp->data == num )
   {
      p = tmp->link;
      delete tmp;
      return;
   }

   // traverse list till the last but one node is reached
   Node *tmp2 = tmp;
   while( tmp!=NULL )
   {
      if( tmp->data == num )
      {
         tmp2->link = tmp->link;
         delete tmp;
         return;
      }

      tmp2 = tmp;
      tmp = tmp->link;
   }
   cout<< "\nElement "<<num<<" not Found." ;
}

int LinkList::Count()
{
      Node *tmp;
       int c = 0;

       //Traverse the entire Linked List
       for (tmp = p; tmp != NULL; tmp = tmp->link)
            c++;

       return (c);
}

int main()
{
      LinkList* pobj = new LinkList();
      pobj->Append(11);
      pobj->Print();

       delete pobj;
       return 0;
}

私が探しているのは、リンクされたリストに配列の要素を挿入できるコードです。たとえば、要素 (1,2,3) と (4,5,6) を含む 2 つの配列がある場合、コードは 2 つのリンク リストを作成し、各リンク リストの最初のノードのアドレスを配列に格納する必要があります。 for ループを実行すると、すべてのリンクされたリストが順番に出力されます。例:

Linked List 1 = (1,2,3)
Linked List 2 = (4,5,6)

配列の数と配列内の要素の数は動的になります。

4

2 に答える 2

2

次に、これを2Dベクトルとして使用する必要があります std::vector< std::vector<int> > vect;

于 2013-07-17T12:43:25.100 に答える
2

注:あなたの質問は学習目的であると思います。そうでない場合は、独自のリンク リストを実装せず、 を使用してくださいstd::vector。キャッシュ ミスのため、リンクされたリストはベクトルstd::listよりもパフォーマンスが低くなります。std::list と syd::vector のパフォーマンス比較に関するこの質問を確認してください。

リンクされたリストは、通常、二重リンクされたリストとして実装され、操作が O(1) にpush_backなりpop_backます (つまり、push_back にトラバースは必要ありません)。

これを実装する方法は、次のノードへのリンクだけでなく、前のノードへのリンクもノードに格納することです。

struct node
{
    node* previous;
    node* next;
    int data;
};

また、リンクされたリスト クラスには、開始ノードに加えて、リストの終了を表すノードが格納されます。

node* begin;
node* end;

「リストの最後のノード」ではなく、 「リストの最後を表すノード」と言ったことに注意してください。つまり、リストの最後のノードを指します。何かを指します (nullptr)。この写真をチェックしてくださいend->previousend->next

したがって、この方法では、push_back実装はend->preious、新しいノードを指す (および をnew_node->next指すend) と、挿入後のnew_node->previousの値を指すだけです。end->previous

于 2013-07-17T09:27:28.427 に答える