С++. Двусвязные списки



Комментарии

15 комментария(ев)
аватар: sd
sd
Дата: ПТ, 21/01/2011 - 22:38
Звание: Энтузиаст
Сообщений: 158

Написано отлично и красиво =) У меня такое задание было в прошлом семестре. Код был почти такой же.

аватар: Stamerlan
Stamerlan (не проверено)
Дата: СБ, 22/01/2011 - 01:42
Звание: Энтузиаст
Сообщений: 340

Раз ты решил использовать классы, то

Element *pHead; // указатель на первый элемент списка
Element *pPrev; // указатель на последний элемент списка
int countElem; // количество элементов в списке

нужно перенести в раздел private и добавить метод getCount();

аватар: Kastor
Kastor
Дата: СБ, 22/01/2011 - 02:03
Звание: Мастер
Сообщений: 1169

Согласен. Я тут немного поступился принципам ООП. Но мне так было легче и быстрее все реализовать.

аватар: Lord_of_fear
Lord_of_fear
Дата: СБ, 22/01/2011 - 11:18
Звание: Мастер
Сообщений: 2213

Цитировать

Написано отлично и красиво =)

Поддерживаю. Просто и доступно Smile И у меня когда-то по институту было такое задание. Реализовывал двусвязный циклический список.

аватар: Woossy
Woossy
Дата: СБ, 19/02/2011 - 03:37
Звание: Наблюдатель
Сообщений: 1

А скажите, пожалуйста, не надо в функции addToList добавить pPrev = temp в первом условии, когда добавляется первый элемент списка? Заранее спасибо.

аватар: Kastor
Kastor
Дата: Втр, 22/02/2011 - 06:30
Звание: Мастер
Сообщений: 1169

Можно конечно туда добавить эту строку. Но так как pPrev = temp должно выполниться в любом случае (добавляется первый элемент или нет), то этот код записан в предпоследней строке. То есть вне условий -> он будет выполнен в любом случае.

P.S. Я тут сначала не правильно понял вопрос. Чето подумал, что спрашивают как правильно добавлять элемент в начало списка и вот код накидал. Думаю лишним не будет =)

void List::addToList(string data) //реализация функции добавления
{
Element *temp = new Element; //создается временный элемент
if(pHead == NULL) //если это первый элемент, то
{
temp->pred = NULL; //обнуляем указатель на
//предшествующий элемент т.к. его нет
temp->next = NULL; //то же самое с последующим
//элементом
pHead = temp; //"голова" указывает на созданный
//элемент
pPrev = temp; //конец тоже указывает на
//созданные элемент
}
else //если не первый, то
{
pHead->pred = temp; //первый (уже второй) указывает на него
temp->pred = NULL;
temp->next = pHead;
pHead = temp;
}

temp->data = data; //копируем данные
countElem++;

}

Вот здесь, можно заметить, та же ситуация, только уже с pHead = temp (добавляем то в начало, а не конец списка). Код pHead = temp прописан в двух вариантах условия, а не в конце, как в коде из статьи.

аватар: Артём Смирнов
Артём Смирнов
Дата: СР, 28/12/2011 - 12:14
Звание: Наблюдатель
Сообщений: 1

Отлично, всё понятно. Долго не мог найти такой наглядный и доступный материал.

аватар: sann
sann
Дата: ЧТ, 02/05/2013 - 03:50
Звание: Наблюдатель
Сообщений: 2

К вам закралась логическая ошибка. Допустим мы создали список из 4 элементов. Удалили элемент 2. Количество элементов стало 3. Теперь мы не можем удалить элемент 4, потому что не пустит if ((numb>countElem) || (numb<1)).

аватар: Kastor
Kastor
Дата: ЧТ, 02/05/2013 - 04:14
Звание: Мастер
Сообщений: 1169

А в чем ошибка то?

На столе лежит четыре палки колбасы. Я взял вторую. Вы меня просите подать четвертую. Ясно, что это невозможно, так как четвертая стала третьей.

Где логическая ошибка? Smile

аватар: sann
sann
Дата: ЧТ, 02/05/2013 - 04:21
Звание: Наблюдатель
Сообщений: 2

Понятно Smile. А не нужно ли в функции удалении всего списка присваивать значение количества элементов = 0 ?