Ввод односвязного списка

209
25 мая 2018, 09:30

Есть один небольшой вопрос. У меня есть список с двумя полями данных (одно для буквы, а второе для числа). Он вводиться с клавиатуры. Пример: 11a33v55b. Но проблема в том, что ввод не прекращаться после нажатие enter. Нужно в конце ввести какой-нибудь / или . или любой знак не число и не буква. Тогда вызывается функция вывода. То-есть 11a33v55b/. А нужно чтобы 11a33v55b нажал enter и ввод закончился.

#include <iostream>
using namespace std;
struct A
{
    int cyfra;
    char symbol;
};
struct List
{
    A a;
    List* next;
};
List * get_AList_item() {
    List *elem = new List;
    if (cin >> elem->a.cyfra >> elem->a.symbol)
        return elem;
    return 0;
}
List *get_list() {
    List *head = get_AList_item(), 
        *tail = head;             
    while ((tail->next = get_AList_item()))
        tail = tail->next;
    return head;  
}
int main() {
    // Получить заполненный список
    List *list = get_list();
    // поэлементно распечатать его
    cout << "List:\n";
    for (List *p = list; p; p = p->next)
        cout << p->a.cyfra << p->a.symbol << ' ';
}
Answer 1

Как вариант, если ввод происходит строкой, как в вашем примере, то можете воспользоваться следующей конструкцией:

std::string str;
std::getline(std::cin, str);

А потом просто парсить вашу строку в список как вам угодно, хоть регулярку для нее написать)

Answer 2

Как уже указали в ответе, воспользуйтесь вводом строк и чтением элементов списка из потока (класс stringstream), связанного с введенной строкой.

Для реализации таких изменений добавьте пару заголовочных файлов

#include <sstream>
#include <string>

и немного модифицируйте функции ввода

List * get_AList_item(stringstream &cin) {
// имя аргумента специально выбрано `cin`, оно "перебьет" стандартное значение, 
// что позволит не менять код функции
//     далее тот же код
....
}

В функцию get_list() потребуется внести побольше изменений

List *get_list() {
    string s;
    getline(cin, s);
    stringstream ss(s);
    // далее единственное изменение кода, вызов `get_AList_item` с параметром
    List *head = get_AList_item(ss), 
        *tail = head;             
    while ((tail->next = get_AList_item(ss)))
        tail = tail->next;
    return head;  
}

Вот, собственно и все.

READ ALSO
Помогите написать функцию [закрыт]

Помогите написать функцию [закрыт]

В массиве А(N,M) строки, не содержащие четных элементов, расположить в порядке убывания сумм элементов

182
Вывод объектов на консоль

Вывод объектов на консоль

Вот такой вопрос, почему каждый раз ,то что я ввожу заменяется новыми введенными данными? Выводится на консоль только новая информация

237
Как в wxString записать ентер?

Как в wxString записать ентер?

Как ентер сделать частью wxString строки?

226
Error C2660: &#39;strcpy_s&#39;: function does not take 2 arguments

Error C2660: 'strcpy_s': function does not take 2 arguments

Я не могу понять в чем моя ошибкаДобавила "_s", не помогает

197