Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049

Перегрузка оператора индексации для связанного списка

07.01.2013, 15:54. Показов 7082. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Требуется перегрузить оператор индексации для связанного списка, я так понимаю в роли списка должны выступать структура или класс... Причем перегруженный оператор должен возвращать заданный элемент связанного списка. Но как реализовать не могу понять... Например, есть класс студент:

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
// index_op.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
 
class stud
{
    public:
        stud()
        {
            FIO = "Иванов Иван Иванович";
            kurs = 4;
        }
        void add_stud()
        {
            cin.ignore();
            cout << "\nВведите ФИО: ";
                getline(cin, FIO, '\n');
            cout << "Введите курс: ";
                cin >> kurs;
        }
 
        void show_stud()
        {
            cout << "\nФИО студента: " << FIO;
            cout << "\nКурс: " << kurs << "\n";
        }
 
    private:
        string FIO;
        int kurs;
};
 
int _tmain()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
}
Заранее благодарю...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2013, 15:54
Ответы с готовыми решениями:

Перегрузка оператора индексации для класса плохо себя ведёт
Собственно, есть такое дело. #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; ...

Перегрузка оператора индексации
Доброго вам времени суток, у меня появилась проблема з перезагузкой оператора индексации (),вот мой код: MyVectorClass.h #include...

Перегрузка оператора индексации
class matrix{ double **c; int m;//кол-во строк int n;//кол-во столбцов } - часть кода подскажите, пож-ста, как перегрузить ()...

8
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
07.01.2013, 16:05
Ммм... Для начала попробуйте написать сам связный список.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
07.01.2013, 17:20  [ТС]
~OhMyGodSoLong~, нашел в инете пример связанного списка, добавил перегрузку и вот что получилось:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// index_op.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
 
struct Node
{
   int data;
   Node *next;
};
 
//класс, описывающих объект "связанный список"
class List
{
private:
   Node *head; //"голова" связанного списка
   
public:
   List() //конструктор класса без параметров
   {
      head = NULL; //первого элемента пока нет
   }
   
   //метод, добавляющий новый узел в список
   void addNode(int d)
   {
      Node *nd = new Node; //динамически создаем новый узел
      
      nd->data = d;        //задаем узлу данные
      nd->next = NULL;     //новый узел в конце, поэтому NULL
      
      if(head == NULL)     //если создаем первый узел
         head = nd;
      else                 //если узел уже не первый
      {
         Node *current = head;
         
         //ищем в цикле предшествующий последнему узел
         while(current->next != NULL)
            current = current->next;
            
         //предшествующий указывает на последний
         current->next = nd;
      }
   }
   
   void printList()
   {
      Node *current = head;
      
      while(current != NULL)
      {
         cout << current->data << endl;
         current = current->next;
      }
   }
 
   void operator[](int num)
   {
       Node *current = head;
 
       for(int i = 0 ; i <= num; i++)
       {
           if(i != num)
                current = current->next;
           else
               cout << current->data << endl;
       }
 
   }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
   List myList;
   
   myList.addNode(5);
   myList.addNode(11);
   myList.addNode(27);
   myList.addNode(35);
   myList.addNode(50);
   
   cout << "Вывод: ";
    myList[1];
   
   return 0;
}
Теперь у меня возник другой вопрос, я занимаюсь по книжке Дейтелей, где и встретил это задание, но до этого даже и речи не было про списки... где можно взять хорошую информацию по этой теме? на форумах прочитал кое-что, но хочется лучше понять принцип... заранее спасибо!
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
07.01.2013, 17:33
А разве принцип не виден в самом начале? Список состоит из узлов (нод), в каждом узле хранятся некоторые данные и ссылка на один и более узлов (связь с другими узлами, поэтому и связный список). Вот и весь принцип.

Если связь одна, то это односвязный список. Если две, то двусвязный. Имея на руках один элемент списка, мы может получить доступ только к тем, с которыми он связан. Отсюда и некоторые неудобства с индексацией. С другой стороны, использование ссылок позволяет гибко управлять структурой списка: локальные изменения структуры (вставки-удаления отдельных узлов) изменяют только соседей этих узлов, но не весь список.

Если вообще почитать, то берите любую книжку по структурам данных. Ту же одноимённую Ахо, Ульмана и Хопкрофта.


И по индексации. Подумайте над двумя вопросами: 1) как вернуть данные из найденного узла, а не печатать его сразу же (вдруг там прибавить 10 к нему надо будет или ещё что), другие же функции могут возвращать значения, да? 2) что делать, если индекс отрицательный или слишком большой (что узлов не хватит).
1
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
07.01.2013, 21:40  [ТС]
~OhMyGodSoLong~, спасибо, принцип я понял буду дальше разбираться)

Добавлено через 4 часа 3 минуты
~OhMyGodSoLong~, у меня возник еще вопрос, а как удалять элемент из списка? например в функцию передается номер удаляемого элемента...
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
07.01.2013, 22:15
Я тут недавно рисовал картинку. Только вам, естественно, надо найти нужный по номеру, а не хранимому значению. Для двусвязного списка немного проще (там до предыдущего ж можно добраться сразу).
0
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
07.01.2013, 22:17
Вот пример как можно удалять конкретный элемент из списка, функция delet, удаляет третий элемент.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream> 
 
struct node 
{  
    int data; 
    node* next; 
}; 
 
class linklist 
{ 
private: 
    node* first; 
public: 
    linklist() { first = NULL; } 
    void additem(int d); 
    void show(); 
    void delet(); // функция удаление конкретного элемента из списка
}; 
 
void linklist::additem(int d) 
{  
    node* newnode = new node; // создаём новый элемент списка
    newnode->data = d; // присваиваем полю data, значение переданное в как аргумент функции
    if(first == NULL) // если элемент первый в списки, то есть first равно NULL
    {
        newnode->next = first; // указателю на следующий элемент, присваиваем значение хранящиеся в указатели first
        first = newnode;       // присваиваем указателю first, значение на новый элемент списка
    }  
    else // ели элемент не первый в списке
    { 
        node* current = first; // создаём элемент текущей и присвоим ему firts, то есть начало списка 
        while(current->next!=NULL) // цикл идёт до тех пор пока указатель элемента не равен значению NULL, то есть до конца списка  
              current = current->next;// переходим от узла к узлу
        current->next = newnode; // когда мы достигли конца списка, элемент расположенный в конце, указывает на наш новый элемент
        newnode->next = NULL;    // новый элемент указывает, на NULL, то есть на конец списка
    } 
}
 
void linklist::show() 
{ 
    node* current = first; 
    while(current) 
    { 
        std::cout << current->data << " "; 
        current = current->next;
    }  
}  
 
void linklist::delet() // функция удаления конкретного элемента из списка
{   
    int n = 3;         // номер элемента, который удаляем
    int count = 1;     // счётчик элементов, начинаем с первого элемента
    node* current = first; // текущий элемент
    node* temp;             // временный элемент
 
    while(count!=n) // проходим циклом, пока не дойдём до элемента с искомым номером
    {   
        temp = current; // временному присваиваем текущий
        current = current->next; // переход на следующий узел
        count++;                 // увеличиваем счётчик
    }   
    temp->next = current->next; // временный ( то есть элемент, стоящий перед текущим, указывает на элемент идущий после текущего
    delete current; // удаляем текущий
}
 
int main() 
{ 
    linklist li; 
    li.additem(11); 
    li.additem(12); 
    li.additem(13); 
    li.additem(14); 
    li.additem(15); 
 
    li.show(); 
    std::cout << std::endl;
    li.delet(); 
    std::cout << std::endl;
    li.show(); 
    
}
1
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.01.2013, 15:51  [ТС]
David Sylva, но Ваша функция не работает если удаляемый элемент стоит первым в списке, я сделал дополнительное условие, и все работает

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
void remove_list(int number)
        {
            int count = 1;     // счётчик элементов, начинаем с первого элемента
            stud* current = first; // текущий элемент
            stud* temp;             // временный элемент
 
            if(number == count)
            {
                first = current ->next;
                current -> next = 0; 
                delete current;
            }
            else
            {
                while(count != number) // проходим циклом, пока не дойдём до элемента с искомым номером
                {   
                    temp = current; // временному присваиваем текущий
                    current = current->next; // переход на следующий узел
                    cout << current ->Fam << endl;
                    count++;                 // увеличиваем счётчик
                }
 
                temp->next = current->next; // временный ( то есть элемент, стоящий перед текущим, указывает на элемент идущий после текущего
                delete current; // удаляем текущий
            }
        }
1
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
08.01.2013, 15:56
yoghurt92 спасибо не учёл фактор первого элемента.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2013, 15:56
Помогаю со студенческими работами здесь

Перегрузка оператора индексации
Можно ли зоздать в своем классе перегрузку оператора , но с двойными скобками вроде? int &amp;operator(int m,int n) { /*.....*/}

Перегрузка оператора индексации []
Имеется некоторый класс почти массив. &quot;Почти&quot; - потому что элементы лежат в памяти не по байтам, а по битам и, соответственно, для...

Перегрузка оператора индексации []
Необходимо перегрузить оператор индексации двумя способами, первый я реализовал #pragma once #include &lt;iostream&gt; using...

Перегрузка оператора индексации
Прошу помощи в решение задачи: нужно перегрузить оператор индексации так что бы по конкретному значению массива выводился его индекс, грубо...

Перегрузка оператора индексации в списке
Доброго времени суток. Имеется список, внутри которого соответственно структура, имеющая элемент данных int и две ссылки вперед/назад ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru