Вывести список
Недавно начал изучать С++.
В программе не выходит вывести список на экран. Вроде все хорошо, а как выводить не соображаю.
Еще буду признателен, если подскажете как в ней поменять местами два элемента без обращения к полю данных и при этом не использовать функцию swap.
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
#include #include #include "stdafx.h" #include using namespace std; struct Node { char word[40]; // область данных int count; Node *next; // ссылка на следующий узел }; typedef Node *PNode; // тип данных: указатель на узел PNode CreateNode(char NewWord[]) { PNode NewNode = new Node; // указатель на новый узел strcpy_s(NewNode->word, NewWord); // записать слово NewNode->count = 1; // счетчик слов = 1 NewNode->next = NULL; // следующего узла нет return NewNode; // результат функции – адрес узла } void AddFirst(PNode &Head, PNode NewNode) { NewNode->next = Head; Head = NewNode; } void AddAfter(PNode p, PNode NewNode) { NewNode->next = p->next; p->next = NewNode; } int main() { PNode p = NULL; // начали с головы списка while (p != NULL) { // пока не дошли до конца printf("%-20s\t%d\n", p->word, p->count);// делаем что-нибудь с узлом p p = p->next; // переходим к следующему узлу } system("pause"); return 0; }
Заметки разработчика
Абсолютно в каждом приложении рано или поздно может потребоваться отобразить содержимое некой коллекции (чаще всего списка) на экран. Стандартный способ, доступный в большинстве объектно-ориентированных языков, таких как C# или Java, является использование цикла for или его более частного случая foreach:
foreach (SomeClass s in someCollection)
Console.WriteLine(s.ToString());
>
Но это довольно громоздкая запись для столь простого действия. Писать целых пять строк, чтобы вывести одну! Поэтому я предлагаю использовать более компактное решение.
Итак, пусть SomeClass — это наш класс, в котором переопределён метод ToString (если вы его ещё не переопределили, то самое время это сделать). someCollection имеет тип List
someCollection.ForEach(Console.WriteLine);
Этой строки достаточно для того, чтобы каждый элемент был выведен в консоль в отдельной строке. Здесь используется делегат (delegate), он же «указатель на функцию» Console.WriteLine.
Более подробная запись этой же команды при помощи лямбда-выражения:
То, что передаётся методу ForEach в качестве параметра — это анонимный метод, записанный кратко в виде лямбда-выражения. Этот метод принимает единственный параметр i, а затем возвращает то, что записано в фигурных скобках. Вместо вызова метода Console.WriteLine вы можете подставить то, что требуется именно вам. Например, добавление записи в лог или БД.
Как правильно создать и вывести список?
Задание звучит так: Представить таблицу в виде линейного списка L, элементами которого являются строки таблицы: №, Фамилия, Оценки (Физика, История, Математика). Написать программу, содержащую следующие функции: — создание списка (ввод данных с клавиатуры); — просмотр списка. Вот мой код:
#include #include using namespace std; struct student < int num; //порядковый номер char fio[15]; //фамилия int ball[3]; //[0] - балл по физике, [1] - истории, [2] - математике >; struct list < student inf; list * next; >; list * org(student inf) < cout > inf.fio; if (inf.fio[0] == '*') return 0; cout > inf.ball[0]; cout > inf.ball[1]; cout > inf.ball[2]; > //return . что здесь надо возвращать? > list * view(list * beg, list * temp) < student inf; temp = beg = 0; inf.num = 1; while (temp ->next != NULL) < cout next; inf.num++; > > int main()
Проблема во второй функции (вывод на экран). Она просто не выполняется. В консоли происходит ввод данных, и после ввода * программа завершается. Моё предположение — потому что не к чему обратиться (предыдущая функция не вернула ничего). Подскажите, пожалуйста, как правильно было бы написать?
Отслеживать
задан 2 июл 2019 в 13:26
35 7 7 бронзовых знаков
Не знаток, но пара вопросов к размышлению: 1) что и зачем вы передаете в функцию org? 2) Куда вы записываете то, что ввели с клавиатуры? 3) Что возвращает функция org? 4) Куда девается то, что она возвращает?
2 июл 2019 в 13:33
@ЮрийКозлов 1) исправил на (student inf) , то есть передаётся информационное поле, чтобы в него шла запись (если я правильно понимаю?). 2) я.. я.. я не знаю.. видимо, я должен был создать буферный массив, чтобы это данные запоминались в нём? 3) я не знаю, что в возврате должно быть, потому как в моих вариантах ( inf , list , student ) возникают ошибки при компиляции. 4) видимо, тоже должно деваться в буферный массив?
2 июл 2019 в 13:44
@ДанилПузырев, Ну, собственно по работе со списком Вам дали хорошую информацию (в ответе drem1lin), постарайтесь разобраться. А по поводу того, что должна возвращать функция.. Ну, как минимум она должна возвращать данные того типа, что указаны в заголовке. inf у Вас везде типа student, а потому не может возвращаться из той функции, что у Вас объявлена, а list и student это вообще типы, а не данные, их нельзя воткнуть в return. И еще маленький совет. Вы куда только не воткнули имя inf. не стоит так делать, это потенциальный источник ошибок.
2 июл 2019 в 13:53
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вы абсолютно правы, вы ничего никуда не вернули. Что бы все работало надо, в случае односвязного списка, в структуру list надо добавить указатель на следующий элемент list * next; . Далее надо в main создать указатель на начало списка — list * begin и в функцию добавления вы передаете этот указатель. Функция добавления пробегает по списку, ищет последний элемент у которого next == null; , выделяет память для нового элемента, и делает next = newElement; и только тогда элемент добавлен в список. И соответственно печать работает похожим образом. Пример работы со списком:
#include #include #include struct Node < char data[30]; Node *next; >; int main() < Node *start; // это будет указатель на начало списка char str[30]; Node *spis = new Node; // создаем список strcpy(spis->data,"0"); // инициализируем его данными spis->next = NULL; // следующий элемент - NULL start = spis; // запоминаем начало for(int i=1; inext = new Node; // создаем элемент (и сразу устанавливаем ссылку на него из текущего) printf("element: "); gets(str); strcpy(spis->next->data,str); // добавляем данные spis->next->next = NULL; // следующий элемент - NULL spis = spis->next; // делаем новый элемент текущим > // выводим printf("\n\n"); spis = start; while(spis) < printf("%s\n",spis->data); spis = spis->next; > // удаляем Node *tmp; spis = start; while(spis) < tmp = spis; spis = spis->next; delete tmp; > getch(); return 0; >
Не выводит список на экран
1. Создай список строк в методе main .
2. Добавь в него 10 строчек с клавиатуры, но только добавлять не в конец списка, а в начало.
3. Используя цикл выведи содержимое на экран, каждое значение с новой строки.
Требования:
Объяви переменную типа список строк и сразу проинициализируй ee.
Программа должна считывать 10 строк с клавиатуры и добавлять их в список.
Программа должна добавлять строки в начало списка.
Программа должна выводить список на экран, каждое значение с новой строки.
Solution.java
- Solution.java
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Уровень 37
18 мая 2020, 08:48
метод size() это фактически размер листа, пока ничего не добавлено, он равен 0
Уровень 41
18 мая 2020, 08:43
Строка 13 — ты назначаешь capacity у списка 10, но размер списка при этом остается равным 0. Ну и исходя из этого далее ошибка логики в строке 16.
- Курсы программирования
- Регистрация
- Курс Java
- Помощь по задачам
- Цены
- Задачи-игры
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
