1 / 1 / 0
Регистрация: 16.09.2019
Сообщений: 55
1

Конструктор в односвязном списке

16.03.2020, 18:07. Показов 1395. Ответов 8
Метки нет (Все метки)

В общем, я только начинаю разбираться в программировании, и у меня возник такой вопрос: как работает конструктор, а именно мне нужно объяснение(в моем коде), как работает next(next) и elem(elem). Препод говорит, вот как понять, что передается в конструктор, list *next или next(next), говорит, что это совершенно разные переменные. Хотя мне казалось, что это одно и то же. Объясните, пожалуйста, и, возможно, предложите, как это можно исправить. Заранее спасибо)


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
#include <stdio.h>
 
const char *in = "in.txt",
           *out = "out.txt";
 
struct list
{
   double elem;
   list *next;
   list(double elem = 0, list * next = NULL) : elem(elem), next(next) {};
};
list *L = NULL;
 
// Функция считывает многочлен из файла
void Input()
{
   double elem;
   FILE *f;
   fopen_s(&f, in, "r");
   while (fscanf_s(f, "%lf", &elem) == 1)
   {
      list *node = new list(elem);
      if (L)
      {
         list *p = L;
         for (p; p->next; p = p->next);
         p->next = node;
      }
      else
         L = node;
   }
   fclose(f);
}
 
// Функция проверяет, является ли последовательность неубывающей
bool IsSorted()
{
   bool flag = true;
   list *p = L;
   for (p; flag == true; p = p->next)
      flag = p->elem <= p->next->elem;
   return flag;
}
 
// Функция разворачивает список
void ReverseList()
{
   list *ptr = NULL,
          *p = L;
   while (p)
   {
      list *next = p->next;
      p->next = ptr;
      ptr = p;
      p = next;
   }
   L = ptr;
}
 
// Функция записывает числа в файл
void Output()
{
   FILE *f;
   fopen_s(&f, out, "w");
   if (L)
      for ( ; L; L = L->next)
         fprintf(f, "%.2lf ", L->elem);
   else
      fprintf(f, "%s", "Список пуст!");
   fclose(f);
}
 
// Функция удаляет список
void DeleteList()
{
   list *tmp;
   while (L)
   {
      tmp = L->next;
      delete L;
      L = tmp;
   }
}
 
int main()
{
   Input();
   if (L && !IsSorted())
      ReverseList();
   Output();
   DeleteList();
   return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2020, 18:07
Ответы с готовыми решениями:

Поиск в односвязном списке
Добрый всем день. Знаю что тема неоднократно поднималась. Помогите реализовать поиск по...

Ошибка в односвязном списке
Помогите решить эти 2 проблемы C4101: NextNode: неиспользованная локальная переменная (в 118...

Ошибка в односвязном списке
#include &quot;exception.cpp&quot; template &lt;class item&gt; class List { struct Element { item inf;...

Ошибка в односвязном списке
#include&lt;iostream&gt; #include&lt;clocale&gt; using namespace std; #define DEBUG class Monom{...

8
1 / 1 / 0
Регистрация: 16.09.2019
Сообщений: 55
17.03.2020, 08:41  [ТС] 2
В любом случае, мне нужно объяснение,как это работает,и возможные варианты исправления(если такие есть). Ну в общем все то,что я описал выше
0
Модератор
Эксперт С++
12080 / 9759 / 5902
Регистрация: 18.12.2011
Сообщений: 26,196
17.03.2020, 09:03 3
Цитата Сообщение от Lexangross51 Посмотреть сообщение
list(double elem = 0, list * next = NULL) : elem(elem), next(next) {};
То, что стоит после двоеточия - это список инициализации для присвоения значений данным класса.
Его можно переписать в виде
C++
1
2
3
4
5
list(double elem = 0, list * next = NULL) 
{ 
   this->elem=elem;
   this->next =next;
}
т.е. в списке инициализации внутри круглых скобок записаны параметры конструктора, а снаружи скобок - данные, члены класса.
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
17.03.2020, 10:09 4
Лучший ответ Сообщение было отмечено Lexangross51 как решение

Решение

Цитата Сообщение от Lexangross51 Посмотреть сообщение
В общем, я только начинаю разбираться в программировании, и у меня возник такой вопрос: как работает конструктор, а именно мне нужно объяснение(в моем коде), как работает next(next) и elem(elem). Препод говорит, вот как понять, что передается в конструктор, list *next или next(next), говорит, что это совершенно разные переменные. Хотя мне казалось, что это одно и то же. Объясните, пожалуйста, и, возможно, предложите, как это можно исправить. Заранее спасибо)
Добавь префикс m_ к названиям переменных класса. Он, префикс, для таких случаев и был придуман.
C++
1
2
3
4
5
6
struct list
{
   double m_elem;
   list *m_next;
   list(double elem = 0, list * next = NULL) : m_elem(elem), m_next(next) {};
};
0
2413 / 1159 / 429
Регистрация: 08.11.2016
Сообщений: 3,232
17.03.2020, 12:24 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Он, префикс, для таких случаев и был придуман.
V for Vendetta, то есть, простите, m_ - значит member - то есть - член класса.
0
858 / 447 / 112
Регистрация: 06.07.2013
Сообщений: 1,494
17.03.2020, 12:33 6
Цитата Сообщение от Lexangross51 Посмотреть сообщение
как это можно исправить.
Дак все нормуль и так, в списке инициализации все сработает даже если имена одинаковые
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
17.03.2020, 12:40 7
Цитата Сообщение от Lexangross51 Посмотреть сообщение
Препод говорит, вот как понять, что передается в конструктор, list *next или next(next)
Книжку почитать?
0
1 / 1 / 0
Регистрация: 16.09.2019
Сообщений: 55
18.03.2020, 07:58  [ТС] 8
Я пытался найти в интернете, но , к сожалению, ничего не нашел
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
18.03.2020, 09:13 9
Цитата Сообщение от Lexangross51 Посмотреть сообщение
Я пытался найти в интернете, но , к сожалению, ничего не нашел
Я говорю, преподаватель не знает как их отличать или вы?
Почему имя параметра конструктора, совпадающее с именем члена, не вызывает противоречий?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2020, 09:13
Помогаю со студенческими работами здесь

Remove_at() в односвязном списке
Привет. Не пойму как в данном(рабочем) коде, при удалении элемента посреди списка, предыдущему...

Поиск по содержимому в односвязном списке
Проблема в поиске по содержимому, выводит ерунду, но при этом все верно находит. К примеру есть 3...

Поиск и удаление в односвязном списке
Помогите с удаление элемента по ключу(номеру этажа). При удалении 2-го элемента в списке, удаляется...

Удаление чисел в односвязном списке
С клавиатуры вводится последовательность целых чисел, завершающаяся нулем. Создать односвязный...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru