Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка узла списка, Линейный список 
V
    Опции темы
Voldemar2004
Дата 6.1.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Код
#include "Declaration.h"

extern List *head;

void List::Add(Library* ptr, int ChapterNumber, AnsiString ChapterName, AnsiString FileName, AnsiString Text)
{
    ptr->ChapterNumber = ChapterNumber;
    ptr->ChapterName = ChapterName;
    ptr->FileName = FileName;
    ptr->Text = Text;
}

void List::Ins(Library ph, List **ptr)
{
    List *tmp = new List;

    tmp->elem = ph;

        tmp->prev = pend;
        tmp->next = *ptr;
        pend = *ptr;

    *ptr = tmp;
}


Файл Declaration.h:
Код
#include <iostream>
#include <sstream>
#include <fstream>

#include "Library.h"

class List
{

public:

void Add(Library* ptr, int ChapterNumber, AnsiString ChapterName, AnsiString FileName, AnsiString Text);

void Ins(Library, List **);

private:

Library elem;

List *next;

List *prev;

List *pbeg, *pend;

};
Сделал метод добавления в конец списка. Как сделать добавление в выбранный узел списка? А то совсем запутался с указателями. Понял, что надо опять выделить память под объект типа:
Код
List *tmp = new List;


Добавлено @ 01:19 
Файл Library.h:
Код
class Library
{

public:

int ChapterNumber;

AnsiString ChapterName, FileName, Text;

};



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
zkv
Дата 6.1.2007, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Код

void List::Ins(Library ph, //что вставляем
List *ptr)//куда (будем считать после ptr)
{
    List *tmp = new List;
    tmp->elem = ph;
//вставка в середину, т.е. еще надо проверить не является элемент после которого вставляем последним
    tmp->prev = ptr;
    tmp->next = ptr->next;
    ptr->next = tmp;
    //    pend = *ptr;
    //*ptr = tmp;
}


List *pbeg, *pend; - по моему лучше сделать их статиком, зачем хранить миллион экземпляров указателей на первый и последний элементы, по одному вполне достаточно, если я правильно понял их назначение.

Это сообщение отредактировал(а) zkv - 6.1.2007, 01:32
PM MAIL   Вверх
Voldemar2004
Дата 6.1.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



zkv, у меня много других методов, в которых я обновляю эти указатели, так что проблем нет. smile 
P.S. Как все оказалось просто.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
zkv
Дата 6.1.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



ну здесь вопрос стиля скорее...
посмотрим сколько места в памяти займет узел списка такого типа:
Код

struct LIST1
{
  int elem;    //4 байта
  List *next; //4 байта
  List *prev; //4 байта
  List *pbeg; //4 байта
  List *pend; //4 байта
};

итого 20 байт на узел (1000 узлов == 20 000 байт) 
теперь посмотрим на такую:
Код

struct LIST2
{
  int elem;    //4 байта
  List *next; //4 байта
  List *prev; //4 байта
  static List *pbeg; //
  static List *pend; //
};

LIST2::pbeg = NULL; // 4 байта
LIST2::pend = NULL; // 4 байта

итого 12 байт на узел плюс 8 байт в единственном экземпляре (1000 узлов == 12 008 байт)
и еще один момент, если они описаны статическими, то можно быть уверенным, что изменив для некоторого узла указатель на начало списка он изменится для всех остальных.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.