Форум программистов, компьютерный форум CyberForum.ru

Поиск элемента в списке - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.95
besbyblik
1 / 1 / 0
Регистрация: 25.12.2010
Сообщений: 77
06.01.2012, 01:24     Поиск элемента в списке #1
Добавьте в класс списков метод int Search(T x) для поиска зна-
чения x в списке. Метод должен возвращать номер узла со значением x
или -1, если x не содержится в списке.

прошу,помогите,пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2012, 01:24     Поиск элемента в списке
Посмотрите здесь:

C++ Поиск элемента в списке.
C++ Поиск элемента в двусвязном списке
Удаление элемента в списке C++
C++ Удаление элемента в списке
C++ Удаление элемента в списке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
06.01.2012, 01:28     Поиск элемента в списке #2
В сферическом списке в вакууме?
besbyblik
1 / 1 / 0
Регистрация: 25.12.2010
Сообщений: 77
06.01.2012, 01:43  [ТС]     Поиск элемента в списке #3
NoMasters, односвязный линейный список

вот класс списков
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class List{ // Класс списков
   Node *first; // Указатель на первое звено
   Node *last; // Указатель на последнее звено
public:
List( ) // Конструктор по умолчанию 
{ first = 0; last = 0; } // создает пустой список 
~List( ); // Деструктор
bool Empty( ) const // Проверка, не пуст ли список
{ return (first = = 0); }
T& Front( ){ return first->d; } // Ссылка на первый элемент
void Push_Front(T Val); // Вставить новое звено в начало списка
void Push_Back(T Val); // Вставить новое звено в конец списка 
T Pop_Front( ); // Удаление первого звена
size_t Size( ); // Количество звеньев списка
class Iterator{ // Класс итераторов списка
Node* curr; // Указатель на текущее звено списка
public:
Iterator(Node *pn = 0) // Конструктор создает итератор
{ curr = pn; } // по указателю pn на звено списка
Iterator(Iterator& p) // Конструктор копирования
{ curr = p.curr; }
Node& operator*( ) // Доступ к текущему звену
{ return *curr; }
Node* operator->( ) // Указатель на текущее звено списка
{ return curr;  }
Iterator& operator++( ) // Префиксный инкремент
{ // Используется в виде  ++p
curr = curr->next; // Возвращает итератор на 
return *this; // следующее звено списка
}
Iterator operator++(int) // Постфиксный инкремент
{  // Используется в виде  p++
Iterator tmp = *this; // tmp – копия текущего итератора
curr = curr->next; // Изменение текущего итератора
return tmp; // Возвращение предыдущего значения итератора
}
bool operator= =(Iterator p) // Сравнение итераторов на равенство
{ return curr = = p.curr; }
bool operator!=(Iterator p) // Сравнение итераторов на неравенство
{ return curr != p.curr; }
}; // Конец объявления класса Iterator
Iterator Begin( ) // Получение итератора 
{ return Iterator(first); } // на первое звено списка
Iterator End( ) // Получение итератора на звено списка, 
{ return Iterator(0); } // следующее за последним звеном
Iterator InsertAfter(Iterator p, T val); // Вставка звена после итератора
void EraseAfter(Iterator p); // Удаление звена после итератора p
};
void PrintList(List& L, char delimiter = ' '); // Вывод списка
#endif
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
06.01.2012, 01:55     Поиск элемента в списке #4
У тебя есть итераторы, обходи по ним список и сравнивай значения, какие проблемы?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
06.01.2012, 12:27     Поиск элемента в списке #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int Search(T x) const
{
    int i = 0;
 
    for(Node* p = first; p != NULL; p = p->next)
    {
        if(p->d == x)
            return i;
        ++i;
    }
 
    return -1;
}
Добавлено через 2 минуты
C++
1
2
Node& operator*( ) // Доступ к текущему звену
{ return *curr; }
Вот так должно быть
C++
1
2
3
4
T& operator*()
{
    return curr->d;
}
besbyblik
1 / 1 / 0
Регистрация: 25.12.2010
Сообщений: 77
06.01.2012, 15:57  [ТС]     Поиск элемента в списке #6
rangerx, заменить 2-ое на 3-ье?зачем?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
06.01.2012, 18:07     Поиск элемента в списке #7
Цитата Сообщение от besbyblik Посмотреть сообщение
заменить 2-ое на 3-ье?зачем?
В смысле? Что "2-ое на 3-ье"? У вас operator* в классе Iterator должен возвращать ссылку на данные хранящиеся в списке, а не на ветвь. Это же касается и operator->, он также должен возвращать указатель на данные. В том и смысл итераторов, что они позволяют перебирать элементы без учёта реализации самого контейнера. Они предоставляют доступ только к данным.
Конструктор копирования тоже записан неверно, он должен иметь такой вид
C++
1
Iterator(const Iterator& p) // Конструктор копирования
Вот такой код с использованием итератора у вас должен отработать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    List list;
 
    // тип T в списке должен быть определён как int
    // вообще, для выбора типа используются шаблоны, но у вас, как я понимаю это typedef
    for(int i = 1; i <= 10; ++i)
        list.Push_Back(i);
 
    // вывод списка на экран
    for(List::Iterator iter = list.Begin(); iter != list.End(); ++iter);
        std::cout << *iter << "\n";
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2013, 17:05     Поиск элемента в списке
Еще ссылки по теме:

Поиск элемента в списке C++
Добавление и удаление элемента в списке C++
Поиск элемента в двусвязном списке C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
krenos
0 / 0 / 0
Регистрация: 14.05.2013
Сообщений: 2
19.12.2013, 17:05     Поиск элемента в списке #8
rangerx, привет. есть небольшой вопрос по программе.
надеюсь заметишь это сообщение...
Yandex
Объявления
19.12.2013, 17:05     Поиск элемента в списке
Ответ Создать тему
Опции темы

Текущее время: 23:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru