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

программирование с++

Не могу организовать поиск (обычный перебор) в связном списке. Подскажите, пожалуйста, кто знает, что я делаю неправильно.
Моя функция поиска находит элемент в списке только тогда, когда искомый элемент находится в хвосте списка. А если он хотя бы второй с конца, то пишет что такого элемента нет, хотя это не так.
#include <iostream>
#include <string>
using namespace std;
struct list{ //сам список
string data;
list *next;
list *prev;
int code;
void initialize();
void add (string dat, int cod);
void search(string dat);
};
void list::initialize() { //инициализация
data = "";
next = NULL;
prev = NULL;
code = 0;
}
void list::add(string dat, int cod){ //добавление в хвост
if (next == NULL){
data = dat;
code = cod;
}
else{
list *newList = new list;
next = newList;
newList->data = dat;
newList->code = cod;
newList->next = NULL;
newList->prev = this;
}

}

void list::search(string dat){ //ПОИСК
list *temp = this;

while(temp!=NULL){

if(temp->data == dat){
cout << dat << " is in list"<<endl;
return;
}
temp = temp->prev;


}

cout << dat << " is not in list" << endl;
}


int main(){
list test;
test.initialize();
test.add("beb", 14);
test.add("ololo", 12);
test.add("bebebebe", 14);
test.search("ololo"); //пишет, что нету такого - а не правильно
test.search("bebebebe"); // есть такое, что правильно
}


Примечание:
Ах да! Точно!! У меня же до else никогда не доходит))))) Вот это да!!
Уже который раз замечаю, что в одиночистве нельзя программировать. Запариваешься на любой мелочи и не видишь в упор ошбку.
Спасибо!!

Примечание:
гм, изменил условие в поиске. все равно ниче не поменялось))
ну хоть теперь знаю в какой функции копать. а то я думал что поиск не правильный))

Примечание:
т.е. я хотел сказать, что изменил условие в добавлении, а не в поиске.
Вобщем функция теперь выглядит так
void list::add(string dat, int cod){
if ( prev == NULL){
data = dat;
code = cod;
}
else{
list *newList = new list;
next = newList;
newList->data = dat;
newList->code = cod;
newList->next = NULL;
newList->prev = this;
}

}


Я вообще то думал, что по умолчанию я сразу имею доступ на последний узел. А к остальным еще добраться надо. Поэтому сейчас и проверяю не является ли узел первым if ( prev == NULL) .
Я что-то не так понимаю?
Инициалайз я подправлю, то я по быстрому захотел написать.

Примечание:
Действительно не меняется :))

Примечание:
Ну меня устраивает и такая реализация, как сделал Harm.
Но, раз правильнее по другому - сделаю по другому. Главное, что я разобрался, а то так бы и думал, что адрес меняется при добавлении нового узла))))

Что значит "если тебе на коленке надо"? Не понял значения.
Ответы:
Неправильно организована операция добавления элементов в список. Напишите функцию, которая выводит весь список, и посмотрите на её вывод после каждого действия в main.
Чуть переделал, так работает (вообще не очень правильно реализован список, лучше отдельный класс элемента и класс контейнера, который содержит указатель на первый элемент)
советую добавить фиктивный узел root в начало и закольцевать список.
тогда при добавлении и изменении списка не придется возиться с граничными условиями вроде последнего и первого элементов.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.