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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
07.01.2013, 15:54     Перегрузка оператора индексации для связанного списка #1
Доброго времени суток! Требуется перегрузить оператор индексации для связанного списка, я так понимаю в роли списка должны выступать структура или класс... Причем перегруженный оператор должен возвращать заданный элемент связанного списка. Но как реализовать не могу понять... Например, есть класс студент:

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);
    
}
Заранее благодарю...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2013, 15:54     Перегрузка оператора индексации для связанного списка
Посмотрите здесь:

Перегрузка оператора индексации [] C++
Перегрузка оператора индексации [] C++
Перегрузка оператора индексации и присваивания (C++) C++
Перегрузка оператора индексации C++
C++ Перегрузка оператора ++ и сортировка списка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
07.01.2013, 16:05     Перегрузка оператора индексации для связанного списка #2
Ммм... Для начала попробуйте написать сам связный список.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
07.01.2013, 17:20  [ТС]     Перегрузка оператора индексации для связанного списка #3
~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;
}
Теперь у меня возник другой вопрос, я занимаюсь по книжке Дейтелей, где и встретил это задание, но до этого даже и речи не было про списки... где можно взять хорошую информацию по этой теме? на форумах прочитал кое-что, но хочется лучше понять принцип... заранее спасибо!
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
07.01.2013, 17:33     Перегрузка оператора индексации для связанного списка #4
А разве принцип не виден в самом начале? Список состоит из узлов (нод), в каждом узле хранятся некоторые данные и ссылка на один и более узлов (связь с другими узлами, поэтому и связный список). Вот и весь принцип.

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

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


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

Добавлено через 4 часа 3 минуты
~OhMyGodSoLong~, у меня возник еще вопрос, а как удалять элемент из списка? например в функцию передается номер удаляемого элемента...
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
07.01.2013, 22:15     Перегрузка оператора индексации для связанного списка #6
Я тут недавно рисовал картинку. Только вам, естественно, надо найти нужный по номеру, а не хранимому значению. Для двусвязного списка немного проще (там до предыдущего ж можно добраться сразу).
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
07.01.2013, 22:17     Перегрузка оператора индексации для связанного списка #7
Вот пример как можно удалять конкретный элемент из списка, функция 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(); 
    
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
08.01.2013, 15:51  [ТС]     Перегрузка оператора индексации для связанного списка #8
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; // удаляем текущий
            }
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2013, 15:56     Перегрузка оператора индексации для связанного списка
Еще ссылки по теме:

перегрузка оператора индексации в списке C++
Перегрузка оператора индексации в одном классе и использование в другом C++
C++ Перегрузка оператора индексации для класса плохо себя ведёт

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

Или воспользуйтесь поиском по форуму:
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
08.01.2013, 15:56     Перегрузка оператора индексации для связанного списка #9
yoghurt92 спасибо не учёл фактор первого элемента.
Yandex
Объявления
08.01.2013, 15:56     Перегрузка оператора индексации для связанного списка
Ответ Создать тему
Опции темы

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