Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Связный список


Автор: Hawaii 24.7.2007, 18:47
Код

// linklist.cpp
// linked list
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct link                           //one element of list
   {
   int data;                          //data item
   link* next;                        //pointer to next link
   };
////////////////////////////////////////////////////////////////
class linklist                        //a list of links
   {
   private:
      link* first;                    //pointer to first link
   public:
      linklist()                      //no-argument constructor
         { first = NULL; }            //no first link
      void additem(int d);            //add data item (one link)
      void display();                 //display all links
   };
//--------------------------------------------------------------
void linklist::additem(int d)         //add data item
   {
   link* newlink = new link;          //make a new link
   newlink->data = d;                 //give it data
   newlink->next = first;             //it points to next link
   first = newlink;                   //now first points to this
   }
//--------------------------------------------------------------
void linklist::display()              //display all links
   {
   link* current = first;             //set ptr to first link
   while( current != NULL )           //quit on last link
      {
      cout << current->data << endl;  //print data
      current = current->next;        //move to next link
      }
   }
////////////////////////////////////////////////////////////////
int main()
   {
   linklist li;       //make linked list

   li.additem(25);    //add four items to list
   li.additem(36);
   li.additem(49);
   li.additem(64);

   li.display();      //display entire list
   return 0;
   }



Помогите изменить функцию additem(), чтобы она добавляла новый элемент в конец связного списка, а не в начало, как здесь. 
Т.е. вывод программы должен быть не 64 49 36 25, а наоборот (первый вставленный элемент будет выводиться первым.)


Автор: boriska 24.7.2007, 19:05
В linklist добавляем указатель, указывающий на последнее звено
Код

class linklist                        // a list of links
{
       private:
       // .......
       link *first, *last;
       public:
       linklist() : first(0), last(0) {}
       void insertAtBack(int);                      
       // .....
};


ну и сам метод
Код

void linklist::insertAtBack(int d)         // add data item
{
        list *newNode = new link;         // make a new link
        newNode->data = d;                 // give it data
  
        if(first == 0)                               // list is empty?
              first = last = newNode;
        else
        {
              last->next = newNode;    
              last = neNode;
         }
}

Автор: JackYF 24.7.2007, 19:05
Цитата(Hawaii @  24.7.2007,  18:47 Найти цитируемый пост)
чтобы она добавляла новый элемент в конец связного списка, а не в начало, как здесь. 

в случае односвязного списка тебе потребуется пройти до конца всего списка, т.е. до элемента, указатель next которого содержит NULL, создать новый узел (это уже написано) и присвоить указателю next найденного узла указатель на новый (только что созданный) элемент.

Автор: Hawaii 24.7.2007, 22:42
Код

void linklist::insertAtBack(int d)         // add data item
{
        list *newNode = new link;         // make a new link
        newNode->data = d;                 // give it data
  
        if(first == 0)                               // list is empty?
              first = last = newNode;
        else
        {
              last->next = newNode;    
              last = neNode;
         }

}





Этот метод не работает. Он выдает огромную последовательность чисел.
Я его чуть изменил, но он стал выводить только первый и последний элементы.


Код

void linklist::insertAtBack(int d)         // add data item
{
        link* newNode = new link;         // make a new link
        newNode->data = d;                 // give it data
  
        if(first == 0)                               // list is empty?
              first = last = newNode;
        else
        {
              last->next = newNode;    
              newNode->next = NULL;
        }

}


Автор: Hawaii 24.7.2007, 23:13
 smile  smile  smile  Разобрался. 
Код

void linklist::additem(int d)         // add data item
{
        link* newNode = new link;         // make a new link
        newNode->data = d;                 // give it data
  
        if(first == 0)                               // list is empty?
        {
              first = last = newNode;
              newNode->next = NULL;
        }
        else
        {
              last->next = newNode;    
              newNode->next = NULL;
              last = newNode;  
        }
}


Всем спасибо !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)