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

Элементарные операции с динамических двусвязным списком - C++

Восстановить пароль Регистрация
 
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
04.09.2013, 23:49     Элементарные операции с динамических двусвязным списком #1
Всем доброго времени суток!
Нужна ваша помощь!
В общем задание:
Сформировать динамический двусвязный список.
Структура содержит фамилию спортсмена, вид спорта, количество очков. Добавлять новые записи так, чтобы информация по каждому виду спорта располагалась последовательно.


Получилось только создать динамический двусвязный список и вывести его на экран, а вот последовательно информацию по виду спорта не получается.. Как Я понял, нужно сделать следующее:
создать массив типа "строка" и занести в неё текущий элемент списка (struc -> namesport = а), потом сделать ещё одну переменную, которая будет указывать на следующий элемент списка за текущим (а -> next = b), а потом просто сравнить их, и если они равны, то ставить их рядом? если да, то как это реализовать, не пойму пока что.. и если Я не правильно веду ход мыслей, поправьте меня, пожалуйста.
Недостающая функция в программе "sort".
Помогите, пожалуйста!

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
#include <iostream>
#include <conio.h>
using namespace std;
 
struct structr
{
    char name[20];
    char namesport[20];
    int numb;
    structr *next;
    structr *prev;
};
 
void show (structr *struc);
//void sort (structr *struc);
 
void main (void)
{
SetConsoleCP(1251);  //Устанавливаем кодировку для ввода
SetConsoleOutputCP (1251); //Устанавливаем кодировку для вывода
    structr *head = 0;
    structr *tail = 0;
    char input[20];
    char input1[20];
    char ch = '0';
    while (ch!=27)
        {
            if (head)
                {   
                    tail -> next = new structr;
                    tail -> next -> prev = tail;
                    tail = tail -> next;
                }
            else 
            {
                head = new structr;
                tail = head;
                head -> prev = 0;
            }
            cout<<"Фамилия:";
            cin>>input;
            strcpy(tail->name,input);
 
            cout <<"Вид спорта: ";
            cin>>input1;
            strcpy(tail->namesport,input1);
 
            cout<<"Введите номер:";
            cin>>tail->numb;
            tail->next = 0;
            cout<<"Для выхода нажмите ESC, для продолжения-любую другую клавишу";
            cout<<endl;
            ch = getch();
        }
show(head);
sort(head);
_getch();
 
}
void show (structr *struc)
{
    while (struc)
    {cout << "Фамилия: " << struc -> name;
    cout <<endl << "Номер: " << struc -> numb;
    cout <<endl << "Вид спорта: " << struc -> namesport;
    cout << endl << endl;
    struc = struc -> next;
    }
}
 
/*void sort (structr *struc)
{   
    
}
*/
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 23:49     Элементарные операции с динамических двусвязным списком
Посмотрите здесь:

C++ Работа с двусвязным списком
Проблема с двусвязным списком C++
Элементарные операции со списками C++
Данное натуральное число N. Используя только элементарные арифметические операции (+, -, *, /) C++
C++ Используя только элементарные арифметические операции, определить сумму и произведение членов последовательности, которые кратны К
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
05.09.2013, 13:37     Элементарные операции с динамических двусвязным списком #2
Если необходимо расположить элементы списка по спорту последовательно в памяти, то я думаю что при вводе нового спортсмена необходимо проверять предыдущий узел на совпадение по виду спорта,если да то записать узел, если нет двигаться дальше назад пока не найдешь узел с этим же видом спорта записать узел при этом остальные сдвинуть на 1 вперед, если узла с таким видом спорта еще не было записать в конец списка.

Проще говоря сортируй список по полю Вид спорта сразу при записи узла, либо запиши все последовательно потом отсортируй и выводи.
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
05.09.2013, 23:18  [ТС]     Элементарные операции с динамических двусвязным списком #3
Цитата Сообщение от egor2116 Посмотреть сообщение
Если необходимо расположить элементы списка по спорту последовательно в памяти, то я думаю что при вводе нового спортсмена необходимо проверять предыдущий узел на совпадение по виду спорта,если да то записать узел, если нет двигаться дальше назад пока не найдешь узел с этим же видом спорта записать узел при этом остальные сдвинуть на 1 вперед, если узла с таким видом спорта еще не было записать в конец списка.

Проще говоря сортируй список по полю Вид спорта сразу при записи узла, либо запиши все последовательно потом отсортируй и выводи.
спасибо.
только в этом-то и проблема, что не понимаю как сортировать.. сравнивать текущее поле namesport с последующим, и если они равны, то ставить их за первым элементом? а если не равны? то в конец списка?
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
06.09.2013, 13:18     Элементарные операции с динамических двусвязным списком #4
Первым делом выбери метод сортировки тут Алгоритмы сортировок
Почитай и посмотри ихние алгоритмы выбери понравившейся, там обычно на примере с массивами чисел а у тебя вместо массива будет список.
Потом напиши метод сортировки
/*void sort (structr *struc)
{

}
*/
Сортировать будешь по полю Вид спорта в алфавитном порядке.
Предполагаю что для этого нужно будет сделать маленькую функцию compare для сравнения какая из строк больше, в цикле по символьно сравниваются две строки и возвращает либо номер узла либо bool либо большее поле и т.д.

Как то так. Будут вопросы задавай чем смогу помогу.
Yandex
Объявления
06.09.2013, 13:18     Элементарные операции с динамических двусвязным списком
Ответ Создать тему
Опции темы

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