Список C++, вопрос о чистом коде

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by awdrg, 15 May 2011.

  1. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    Вообщем такое дело. Имеется какая то структура. Имеется двусвязный список. Вопрос: как нужно организовать список по правильному: так, чтобы он хранил адрес моей структуры, или полную ее копию?
     
  2. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    очень просто
    создаешь указатель HEAD - он всегда указывает на начало списка.
    Каждое звено структуры в списке - должно иметь указатели на следующие звено списка, и на предыдущее звено списка.
    Для хранения структуры, должен быть указатель на твою структуру, которому выделена память.
     
  3. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    нет, мне нужно понять ЧТО ИМЕННО должен хранить список:
    копию структуры
    ИЛИ
    адрес структуры, которую я в него добавил?
     
  4. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    PHP:
    struct INFO {
       
    char Name[128];
       
    int Age;
       
    struct INFO *next;
       
    struct INFO *prev
     }
     
    1 person likes this.
  5. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    благодарю
     
    #5 awdrg, 15 May 2011
    Last edited: 15 May 2011
  6. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    смотри, а *next нужно обязательно выделять память, или можно просто присвоить ему адрес какой нибудь структуры извне?
    т.е возможно два случая:
    1) список будет как бы стеком (я копирую в него информацию из источника, и дальнейшее изменение источника на список не влияет)
    2)либо вместо выделения памяти я присваиваю *next адрес какой нибудь структуры и теперь каждое изменение источника будет затрагивать список.

    какой вариант верный?
     
  7. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    Ты должен указателю присвоить адрес на структуру
    при том структура должна быть типа INFO
    а где и как ты выделищь память - наплевать
     
  8. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    ок, понял
     
  9. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    созадешь указатель
    struct INFO *tmp;
    выделяем память
    tmp = new struct INFO ;
    Инициализируешь данные
    и кидяешь в список
     
  10. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Правильный ответ тот, что тебе нужно читать читать и читать про структуры и указатели.

    В двух словах(далее имеется ввиду 32-х битная архитектура) - переменная указатель в памяти занимает 4 байта, указывает на какое либо место в памяти. Возьмем структуру составленную rudi, один ее "экземпляр" в памяти будет занимать 140 байт(ну тут смотря еще какое выравнивание в менеджере памяти, но речь не об этом). Полезной информации в данном случае она несет поля Name и Age, далее идут два указателя(вообще можно и одним указателем обойтись - только на след. элемент, но тут смотря какое использование, часто требуется и два, как указанно).
    Идея в чем, полную копию как ты выразился указать не выйдет(можно конечно, но это бред). Для добавления в список(к примеру в конец) - выделяешь память под новую такую структуру и имеешь на нее указатель, по нему ее изменяешь и т.д. А конечному элементу списка в поле next пишешь указхатель на ту структуру которую выделил(ей собсна в поле prev пишешь укзаатель на тот последний элемент), таким образом у тебя та выделенная новая структура встает в конец списка. При удалении нужные указатели ставишь в NULL и все(не забудь освободить память от того экземпляра структуры которую удалил из списка).
     
    1 person likes this.
  11. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    и потом снова выделяем память для tmp и инициализируем следующий элемент списка
    так и сделал :)
     
  12. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    вот, про это я и спрашивал, thx