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

Связные списки, дополнить код - C++

Восстановить пароль Регистрация
 
LIAR52
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 4
28.06.2013, 14:57     Связные списки, дополнить код #1
Прошу помочь, учусь на заочке и поэтому все очень сложно.. Есть код программы которая создает связный список элементов и позволяет добавлять новые и удалять.. Необходимо добавить в программу комплексные числа и оператор перегрузки.. Help me.. вот то что есть в попытке создания:
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
 #include <iostream.h>
  #include <conio.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <dos.h>
  #include <graphics.h>
//using namespace std;
 
//typedef int newtp;
template<class Type>
struct node
{
    Type data; //  данные
    node* next; // указатель на следующий
    node* pred; // указатель на предыдущий
};
 
 
template<class Type>
class linklist // класс связный список
{
private:
    node<Type>* first; // указатель на начало
public:
    linklist() { first = NULL; } // в конструкторе инициализируем его, он указывает в
                                 // в место где нет полезной информации
 
    void push( Type d, int pos); // метод добавления элемента
    int pop( int pos);  // метод удаления элемента
    void clean(); // удаление всех элементов
    void Show();
    void Display();
};
 
template<class Type> void linklist<Type>::push( Type d, int pos) // метод добавления элемента
{
 
    node<Type>* newnode = new node <Type>; // создаём новый элемент
    newnode->data = d; // вводим в него данные
    if(first ==  NULL)   // если это первый элемент в списке
    {
        newnode->next = newnode;
        newnode->pred = newnode;
        first = newnode; // first  указывает на него
    }
    else
    {
        node<Type>* temp = first; // создаём времменный указатель
        for ( int i = pos; i > 1; i--,temp=temp->next); // цикл
            temp->pred->next = newnode;
            newnode->pred = temp->pred;
            newnode->next = temp; // добавляем перед времменным
            temp->pred = newnode;
    }
}
 
 
template<class Type> int linklist<Type>::pop( int pos) // удаляем элемент из списка по индексу
{
  if(first == NULL)  return 0; // если список пуст
  int l;
  Type val;
 
  if(first == first ->next) // если это последний элемент в списке
  {
      val = first->data;
      delete first;
      first = NULL;
  }
  else
 {
      node<Type>* temp = first;
      for ( int i = pos; i > 1; i--, temp = temp->next);
          if( temp == first) first = temp->next;
              temp->pred->next = temp->next; // удаляем temp элемент
              temp->next->pred = temp->pred;
              val = temp->data;
              delete temp;
  }
  return l;
}
 
template<class Type> void linklist<Type>::clean() // удалить все элементы из списка
{
    if(first == NULL) return ;
    for ( node<Type>* newnode = first->next; newnode!=first; newnode = newnode->next) delete newnode;
    delete first;
    first = NULL;
}
 
template<class Type> void linklist<Type>::Show() // просмотр элементов в списке
{   Type d;
    //if(first == NULL) return ;
    node<Type>* newnode = first;
   //   do
    //{
   //while(newnode!=first);
        newnode->data = d;
 
        cout<<newnode << endl;
        //newnode = newnode->next;
    //} while(newnode!=first);
}
 
 
struct Complex
{
        double re,im;
        Complex()
        {
                re=im=0.0;
        }
        Complex(double x, int y)
        {
                re = x;
                im = y;
        }
    Complex& operator = (Complex & arg2)
        {
                re = arg2.re;
                im = arg2.im;
        return *this;
        }
};
 
 
 
int main()
{
    int index;
    int a;
    linklist<Complex> li;
 
 
    //for(int i = 0; i < 4; ++i)
    //{
    //index = 0;
    //cout<<"\n Vvedite dobavlyaemii element " ;
    //  cin>>a;
    //index = index+1;
    li.push(Complex(3,1),1);
    li.push(Complex(4,7),2);
    //  }
    li.Show();
 
 
    //cout<<"\n Vvedite element shtobi dobavit v nachalo " ;
    //cin>>a;
    //li.push(a,1);
    //li.view();
 
 
    //cout<<"\n Vvedite index udalyaemogo element " ;
    //cin>>a;
    //li.pop(a);
    //li.view();
 
    system ("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2013, 14:57     Связные списки, дополнить код
Посмотрите здесь:

Связные списки C++
C++ Связные списки
C++ Связные списки
Связные списки C++
C++ Связные списки.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2013, 15:09     Связные списки, дополнить код #2
Цитата Сообщение от LIAR52 Посмотреть сообщение
и оператор перегрузки..
Любой? Сделайте перегрузку вывода ( << ). Код для вывода (Show()) у вас есть.
LIAR52
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 4
28.06.2013, 16:14  [ТС]     Связные списки, дополнить код #3
да, любой.. Просто я не совсем представляю как это сделать, и в данном коде функция Show отказывается выводить комплексные числа

Добавлено через 3 минуты
вот код для Show, который у меня работает с целыми числами
C++
1
2
3
4
5
6
7
8
9
10
void linklist::Show() // просмотр элементов в списке
{
    if(first == NULL) return ;
    node* newnode = first;
    do
    {
        cout << newnode->data << endl;
        newnode = newnode->next;
    } while(newnode!=first);
}
Добавлено через 55 минут
кто может помочь за вознаграждение?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2013, 17:33     Связные списки, дополнить код #4
Я. Если так (перегрузить, дружественный для класса Complex, operator<< )?
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
//#include <graphics.h>
using namespace std;
 
//typedef int newtp;
template<class Type>
struct node
{
    Type data; //  данные
    node* next; // указатель на следующий
    node* pred; // указатель на предыдущий
};
 
 
template<class Type>
class linklist // класс связный список
{
private:
    node<Type>* first; // указатель на начало
public:
    linklist() { first = NULL; } // в конструкторе инициализируем его, он указывает в
                                 // в место где нет полезной информации
 
    void push( Type d, int pos); // метод добавления элемента
    int pop( int pos);  // метод удаления элемента
    void clean(); // удаление всех элементов
    void Show();
    void Display();
    
};
 
 
template<class Type> void linklist<Type>::push( Type d, int pos) // метод добавления элемента
{
 
    node<Type>* newnode = new node <Type>; // создаём новый элемент
    newnode->data = d; // вводим в него данные
    if(first ==  NULL)   // если это первый элемент в списке
    {
        newnode->next = newnode;
        newnode->pred = newnode;
        first = newnode; // first  указывает на него
    }
    else
    {
        node<Type>* temp = first; // создаём времменный указатель
        for ( int i = pos; i > 1; i--,temp=temp->next); // цикл
            temp->pred->next = newnode;
            newnode->pred = temp->pred;
            newnode->next = temp; // добавляем перед времменным
            temp->pred = newnode;
    }
}
 
 
template<class Type> int linklist<Type>::pop( int pos) // удаляем элемент из списка по индексу
{
  if(first == NULL)  return 0; // если список пуст
  int l;
  Type val;
 
  if(first == first ->next) // если это последний элемент в списке
  {
      val = first->data;
      delete first;
      first = NULL;
  }
  else
 {
      node<Type>* temp = first;
      for ( int i = pos; i > 1; i--, temp = temp->next);
          if( temp == first) first = temp->next;
              temp->pred->next = temp->next; // удаляем temp элемент
              temp->next->pred = temp->pred;
              val = temp->data;
              delete temp;
  }
  return l;
}
 
template<class Type> void linklist<Type>::clean() // удалить все элементы из списка
{
    if(first == NULL) return ;
    for ( node<Type>* newnode = first->next; newnode!=first; newnode = newnode->next) delete newnode;
    delete first;
    first = NULL;
}
 
template<class Type> void linklist<Type>::Show() // просмотр элементов в списке
{   
    if(first == NULL) return ;
    node<Type>* newnode = first;
    do
    {
        cout << newnode ->data << endl;
        newnode = newnode ->next;
    } while (newnode != first);
}
 
struct Complex
{
        double re, im;
        Complex()
        {
                re = im = 0.0;
        }
        Complex(double x, int y)
        {
                re = x;
                im = y;
        }
    Complex& operator = (Complex & arg2)
        {
                re = arg2.re;
                im = arg2.im;
        return *this;
        }
        
        friend ostream& operator<<(ostream& out, Complex& obj)
        {
            out << obj.re << ' ' << obj.im;
            return out;
        }
};
 
 
 
int main()
{
    int index;
    int a;
    linklist<Complex> li;
 
 
    //for(int i = 0; i < 4; ++i)
    //{
    //index = 0;
    //cout<<"\n Vvedite dobavlyaemii element " ;
    //  cin>>a;
    //index = index+1;
    li.push(Complex(3,1),1);
    li.push(Complex(4,7),2);
    //  }
    li.Show();
 
 
    //cout<<"\n Vvedite element shtobi dobavit v nachalo " ;
    //cin>>a;
    //li.push(a,1);
    //li.view();
 
 
    //cout<<"\n Vvedite index udalyaemogo element " ;
    //cin>>a;
    //li.pop(a);
    //li.view();
 
    system ("PAUSE");
    return 0;
}
LIAR52
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 4
28.06.2013, 17:39  [ТС]     Связные списки, дополнить код #5
Спасибо, вам! Конечно наверно глупый, вопрос, но как я понял данная перегрузка используется просто в самой программе при операции выведении на экран, больше нигде ее вызывать не надо?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2013, 17:46     Связные списки, дополнить код #6
Цитата Сообщение от LIAR52 Посмотреть сообщение
больше нигде ее вызывать не надо?
Она сама вызовется, если справа от cout << будет объект Complex.

Добавлено через 1 минуту
Например:
C++
1
2
Complex obj(5, 6);
cout << obj; // выведет 5 6
Добавлено через 2 минуты
Сам вывод объекта Complex можете и изменить в коде, как нужно. Это я для примера написал вывод полей через пробел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2013, 17:50     Связные списки, дополнить код
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
LIAR52
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 4
28.06.2013, 17:50  [ТС]     Связные списки, дополнить код #7
Все понял, спасибо большое!
Yandex
Объявления
28.06.2013, 17:50     Связные списки, дополнить код
Ответ Создать тему
Опции темы

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