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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
LIAR52
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 4
#1

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

28.06.2013, 14:57. Просмотров 339. Ответов 6
Метки нет (Все метки)

Прошу помочь, учусь на заочке и поэтому все очень сложно.. Есть код программы которая создает связный список элементов и позволяет добавлять новые и удалять.. Необходимо добавить в программу комплексные числа и оператор перегрузки.. 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++
Вот есть код все работает отлично но препод сказал что-бы при вводе элементов в список элементы сортировались вот к примеру 20 5 8 12 1 10...

Связные списки в С++.Не понял ничего - C++
Здравствуйте люди помогите пажалуйсто понять как работают связные списки.Я учусь по книге C++ для чайников.С начало все гладко...

Связные списки и множества элементов - C++
Здравствуйте!Помогите пожалуйста переделать программу с помощью упорядоченых связных списков: 1)Написать программу которая: -проверяет...

исправить ошибку) Связные списки - C++
помогите исправить ошибку в программе сама программа с ошибкой #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;iostream&gt; ...

Что не так с кодом? Компилируется, но не работает (связные списки) - C++
#include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; #include &lt;string.h&gt; #include &quot;iostream&quot; using namespace std; class Elem { ...

Объяснить почему программа уходит в бесконечный цикл (связные списки) - C++
Всем привет. Собрал связанный список, он работает, но при вводе типа char, программа уходит в бесконечный цикл. Без данного типа...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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++
Понимаю, что задач вроде не сложная, но никак не получается переделать код. Я решил задачу , которую выкладывал ниже, про кол-во...

Удалить элементы после запятой (дополнить код) - C++
Добрый вечер всем! У меня такая проблема: нужно написать программу для удаления слова (одного слова) после запятой, программа удаляет слова...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru