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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
OcbMuHor
Заблокирован
#1

Реализовать односвязный список данных вида "Страна, город, количество населения" - C++

15.06.2011, 11:28. Просмотров 1228. Ответов 16
Метки нет (Все метки)

Поставлена задача реализовать односвязный список данных вида
Страна город количество населенияОбеспечить выполнение операций:
добавление элемента в список
удаление элемента из списка
разделение списка на два по признаку: Страна, которая имеет города числом жителей >=k, <k
подсчет числа всех жителей списка
распечатка списка (поток вывода уточняю, скорее всего вывод на принтер)

собственно вот наработки. кто что подскажет, укажет ошибки...
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
#include <iostream>
 
class List
{
private:
    struct node
        {
            char coutry[20];
            char city[20];
            long int city_people;
            node *next;
        };
    node *phead;
    node *current;
public:
    void spy_push()
    {
        phead = new node ();
        current = phead;
        unsigned short k, tmp = 0;
        std::cout << "Dlina spyska" << std::endl;
        std::cin >> k;
        do
        {
            tmp++;
            std::cout << "\nCounty: ";
            std::cin >> current->coutry;
            std::cout << "\nCity: ";
            std::cin >> current->city;
            std::cout << "\nCity people : ";
            std::cin >> current->city_people;
            current->next = new node();
            if (tmp == k) current->next = 0;
            current = current->next;
        } while (tmp < k);
    }
 
    void spy_print()
    {
        for (current=phead; current!=0; current=current->next)
        {
            std::cout << "Coutry: " << current->coutry << "City: " << current->city
            << "City_people: " << current->city_people << std::endl;
        }
    }
 
    void people_value()
    {
        unsigned long long int value = 0;
        for (current=phead; current!=0; current=current->next)
        {
            value = value + current->city_people;
        }
        std::cout << "Value of the people list off" << value << std::endl;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2011, 11:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализовать односвязный список данных вида "Страна, город, количество населения" (C++):

Реализовать односвязный список для хранения и операций с данными вида "Количество внешних связей" - C++
Реализовать односвязный список для хранения и операций с данными вида: Объект Количество внешних связей Внешние связи Обеспечить...

Реализовать односвязный список для хранения данных вида: ФИО, группа, средний балл. - C++
Интересует именно структура(синтаксис) как это описать.Как в памяти оно выглядит я представляю и со структурами более-менее уже знаком.Если...

На основе заданных прототипов реализовать функции-члены для пользовательского класса "Односвязный список" - C++
Извиняюсь,забыла принт опреедлить Преподаватель дал прототипы функций ,которые надо определить для односвязного списка,но,начав...

Считать с файла информацию о команде "Название" "Город", количество побед, поражений, ничьих, забитых и пропущенных мячей - C++
Здравствуйте. Необходимо написать программу С++ : &quot;Считать с файла информацию о команде &quot;Название&quot; &quot;Город&quot;, количество побед, ...

Реализовать структуру данных "Линейный список" - C++
Всем привет. Не получается написать программу к следующему заданию. На словах я понимаю, как это выполнить, но структурами раньше не...

Класс "Студент", реализовать динамический список "Группа студентов" - C++
реализовать динамический список &quot; группа студентов&quot;. Узел: -группа -фамилия Функции списка: -добавление по алфавиту ...

16
Aneron
158 / 157 / 12
Регистрация: 20.04.2010
Сообщений: 570
15.06.2011, 11:37 #2
это тупо описание класса. и нет возможности проверить его работоспособность.
напиши программу чтоб проверить твой класс. потом посмотрим.
0
OcbMuHor
Заблокирован
15.06.2011, 12:10  [ТС] #3
Цитата Сообщение от Aneron Посмотреть сообщение
это тупо описание класса. и нет возможности проверить его работоспособность.
напиши программу чтоб проверить твой класс. потом посмотрим.
Я конечно мало что понимаю, всё грызем, грызём... но что мешает описать все функции в теле класса?
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.06.2011, 17:00 #4
OcbMuHor, как ваш пост стыкуется с предложением описать функцию main?
0
OcbMuHor
Заблокирован
15.06.2011, 17:10  [ТС] #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
OcbMuHor, как ваш пост стыкуется с предложением описать функцию main?
я не вижу пока необходимости вообще написания тела программы. На данном этапе у меня стоит задача реализовать функции. Ну если это поможет. то вот пожалуйста. Код переписан полностью
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
#include <iostream>
 
struct node
{
    char country[20];
    char city[20];
    long int city_people;
    node *next;
    node *prev;
};
 
 
int main()
 {
     node *pbeg = first();
     node *pend = pbeg;
 }
 
// формирование первого элемента
node *first()
{
    node *tmp = new node ();
    std::cout << "Country: "; std::cin >> tmp->country;
    std::cout << "City: "; std::cin >> tmp->city;
    std::cout << "City_people: "; std::cin >>tmp->city_people;
    tmp->next = NULL;
    tmp->prev = NULL;
    return tmp;
}
// добавление элемента в конец списка
void Insert_to_end (node **pend)
{
    node *tmp = new node();
    std::cout << "Country: "; std::cin >> tmp->country;
    std::cout << "City: "; std::cin >> tmp->city;
    std::cout << "City_people: "; std::cin >>tmp->city_people;
    tmp->next = NULL;
    tmp->prev = *pend;
    *pend = tmp;
}
// поиск элемента по символьному ключу страна И город
node *find1 (node const *pbeg, char key1[20], char key2[20])
{
    node *tmp = pbeg;
    while (tmp)
    {
        if ((tmp->country == key1)&&(tmp->city == key2)) break;
        tmp = tmp->next;
    }
    return tmp;
}
/* поиск элемента по символьному ключу страна или город
node *find2 (node const *pbeg, char key[20])
{
    node *tmp = pbeg;
    while (tmp)
    {
        if (tmp->country == key) break;
        if (tmp->city == key) break;
        tmp = tmp->next;
    }
    return tmp;
}*/
 
 
// поиск элемента по целочисленному ключу
node *find3 (node const *pbeg, long int key)
{
    node *tmp = pbeg;
    while (tmp)
    {
        if (tmp->city_people == key) break;
        tmp = tmp->next;
    }
    return tmp;
}
// удаление элемента
bool remoove (node **pbeg, node **pend, char key1[20], char key2[20])
{
    if (node *pkey = find1(*pbeg, key1, key2))
    {
        if (pkey == *pbeg)
        {
            *pbeg = (*pbeg)->next;
            (*pbeg)->prev=0;}
        else if (pkey == *pend)
        {
            *pend = (*pend)->next;
            (*pend)->next = 0;}
        else
        {
            (pkey->prev)->next = pkey->next;
            (pkey->next)->prev = pkey->prev;
        }
        delete pkey;
        return true;
    }
    return false;
}
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.06.2011, 17:23 #6
OcbMuHor, не понял, а в честь чего вы так резко перешли от объектно-ориентированного к процедурному программированию?
После реализации функций их надо проверить. Как вы собрались проверять их без точки входа - функции main.
0
Aneron
158 / 157 / 12
Регистрация: 20.04.2010
Сообщений: 570
15.06.2011, 17:23 #7
тупой и банальный вопрос. как ты будешь проверять свой код на корректность работы?
0
OcbMuHor
Заблокирован
15.06.2011, 17:45  [ТС] #8
Цитата Сообщение от Aneron Посмотреть сообщение
тупой и банальный вопрос. как ты будешь проверять свой код на корректность работы?
Это вопрос риторический...
0
OcbMuHor
Заблокирован
16.06.2011, 21:25  [ТС] #9
Ну собственно вот и int main() маялся долго, пришел к такому пути решения. Не работает кейс 4. Вопросы такие:
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
#include <iostream>
#include <string>
 
struct Node
{
    std::string Country;
    std::string City;
    long int City_people;
    Node *next;
};
 
int main()
{
    unsigned short i=0, k, n, l=0;
    Node *phead = new Node();
    Node *tmp;
    tmp = phead;
    long long int count=0;
    std::string key_Country;
    long int key_City_peoiple;
    std::cout <<"The long of List: ";
    std::cin >> k;
    do
    {
        i++;
        std::cin >> tmp->Country;
        std::cin >> tmp->City;
        std::cin >> tmp->City_people;
        tmp->next = new Node();
        if (i ==k) tmp->next = NULL;
        tmp = tmp->next;
    } while (i<k);
    std::cout << "\nFor continuation of work pus a keychar:";
    std::cout << "\n1: For the output a list.";
    std::cout << "\n2: For the input new intem (to the end of list)";
    std::cout << "\n3: For the delete item";
    std::cout << "\n4: For the make two lists on a sign: list Country, City_people < n, ";
    std::cout << "\nand list Country, City_people >=n. after maked two lists output";
    std::cout << "\n5: For the count all people of the list";
    std::cout << "\n6: For the exit of programm" << std::endl;
    std::cin >> k;
    switch (k)
    {
    case 1: for (tmp = phead; tmp != NULL; tmp = tmp->next)
            {
                std::cout << tmp->Country << "  " << tmp->City << "  " << tmp->City_people
                    << std::endl;
            }; 
    case 2: tmp = phead;
            do
            {
                tmp = tmp->next;
                if (tmp == NULL){
                    tmp = new Node();
                    std::cin >> tmp->Country;
                    std::cin >> tmp->City;
                    std::cin >> tmp->City_people;
                    tmp->next =NULL;
                    tmp=tmp->next;
                }
            } while (tmp != NULL);
    case 3: std::cout << "\nPlease select a nomber of list you want to delete" << std::endl;
            std::cin >> n;
            i=0;
            for (tmp = phead; tmp != NULL; tmp = tmp->next)
            {
                i++;
                if (i == n){
                    if (tmp != NULL){
                        if (tmp == phead){
                            phead = tmp->next;
                            delete (tmp);
                            tmp = phead; break;
                        }
                        else{
                            Node *tmp1 = new Node();
                            tmp1 = tmp->next;
                            delete (tmp);
                            tmp = tmp1;
                            delete (tmp1); break;
                        }
                    }
                    else break;
                }
            }
    case 4: Node *phead1, *phead2;
            Node *tmp1, *tmp2;
            phead1 = new Node();
            tmp1 = phead1;
            phead2 = new Node();
            tmp2 = phead2;
            i = 0;
            k = 0;
            std::cout << "\nPlease select a key from country: ";
            std::cin >> key_Country;
            std::cout << "\nPlease select a key from City people amount: ";
            std::cin >> key_City_peoiple;
            for (tmp = phead; tmp!=NULL; tmp=tmp->next)
            {
                if (tmp->Country == key_Country){
                    if (tmp->City_people < key_City_peoiple){
                        i++;
                        tmp1->Country = tmp->Country;
                        tmp1->City = tmp->City;
                        tmp1->City_people = tmp->City_people;
                        tmp1->next = new Node();
                        tmp1 = tmp1->next;
                        tmp1->=NULL;
                    }
                    else{
                        k++;
                        tmp2->Country = tmp->Country;
                        tmp2->City = tmp->City;
                        tmp2->City_people = tmp->City_people;
                        tmp2->next = new Node();
                        tmp2 = tmp2->next;
                        tmp2->next = NULL;
                    }
                }
            }
            for (tmp1 = phead1; l<i; tmp1=tmp1->next)
            {
                l++;
                if (l == i-1) tmp1->next = NULL;
            }
            l=0;
            for (tmp2 = phead2; l<k; tmp2=tmp2->next)
            {
                l++;
                if (l == k-1) tmp2->next = NULL;
            }
            std::cout <<"\nOutput List where people of Cities < " << key_City_peoiple;
                std::cout << std::endl;
            for (tmp1=phead1; tmp1!=NULL; tmp1=tmp1->next){
                std::cout << tmp1->Country << "  " << tmp1->City << "  ";
                std::cout << tmp1->City_people << std::endl;
            }
            std::cout <<"\nOutput List where people of Cities >= " << key_City_peoiple;
                std::cout << std::endl;
            for (tmp2=phead2; tmp2!=NULL; tmp2=tmp2->next){
                std::cout << tmp2->Country << "  " << tmp2->City << "  ";
                std::cout << tmp2->City_people << std::endl;
            }
    case 5: std::cout << "\n5: The count all people of the list is: ";
            for (tmp = phead; tmp != NULL; tmp = tmp->next)
            {
                count = count + tmp->City_people;
            }
            std::cout << count << std::endl;
    case 6: break;
    default: std::cout << "Mabe you mistake? please, try again." <<std::endl;
    }
return 0;
}
1. как бы так сообразить можно было рекурсию на switch, т.е. по завершении выполнения одного из условий или ввода не того символа вернуть выполнение программы на строку №33.
2. ошибка в кейс 4
[IMG]http://i.***********/i5/30/31/1633130/Bezymeny-1.jpg[/IMG]
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.06.2011, 21:27 #10
OcbMuHor, 1. Про циклы слышали?
0
OcbMuHor
Заблокирован
16.06.2011, 21:32  [ТС] #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
OcbMuHor, 1. Про циклы слышали?
В чем издевка?
0
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.06.2011, 21:36 #12
OcbMuHor, какие издёвки? Вполне конкретный вопрос. В вашей формулировке "как бы так сообразить можно было рекурсию на switch, т.е. по завершении выполнения одного из условий или ввода не того символа вернуть выполнение программы на строку №33" - это то же самое, что в моей "цикл".
0
OcbMuHor
Заблокирован
17.06.2011, 01:21  [ТС] #13
а про это. ну это не основной вопрос. думаю что с рекурсией не так сложно обстоят дела, просто устал, может кто уже писал функции подскажет. А по второму вопросу есть что?

Добавлено через 3 часа 42 минуты
короче вот готовый список с функциями. единственное, что не работает кейс удаления элемента списка. Помогите пожалуйста его подкорректировать с возможностью удалить любой элемент.
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
#include <iostream>
#include <string>
 
struct Node
{
    std::string Country;
    std::string City;
    unsigned long long int City_people;
    Node *next;
};
 
int main()
{
    unsigned short i=0, k, n, l=0;
    Node *phead = new Node();
    Node *tmp;
    tmp = phead;
    unsigned long long int count=0;
    std::string key_Country;
    long int key_City_peoiple;
    std::cout <<"The long of List: ";
    std::cin >> k;
    do
    {
        i++;
        std::cin >> tmp->Country;
        std::cin >> tmp->City;
        std::cin >> tmp->City_people;
        tmp->next = new Node();
        if (i ==k) tmp->next = NULL;
        tmp = tmp->next;
    } while (i<k);
    do
    {
        std::cout << "\nFor continuation of work pus a keychar:";
        std::cout << "\n1: For the output a list.";
        std::cout << "\n2: For the input new intem (to the end of list)";
        std::cout << "\n3: For the delete item";
        std::cout << "\n4: For the make two lists on a sign: list Country, City_people < n, ";
        std::cout << "\nand list Country, City_people >=n. after maked two lists output";
        std::cout << "\n5: For the count all people of the list";
        std::cout << "\n6: For the exit of programm" << std::endl;
        std::cin >> k;
        switch (k)
            {
                        //вывод
                case 1: for (tmp = phead; tmp != NULL; tmp = tmp->next)
                        {
                                std::cout << tmp->Country << "  " << tmp->City << "  " << tmp->City_people;
                                std::cout << std::endl;
                        } break;
                        //добавление элемента
                case 2: tmp = phead;
                        do
                        {
                            tmp = tmp->next;
                            if (tmp->next == NULL){
                                tmp->next = new Node();
                                tmp = tmp->next;
                                std::cin >> tmp->Country;
                                std::cin >> tmp->City;
                                std::cin >> tmp->City_people;
                                tmp->next = NULL;
                            }
                        } while (tmp->next!= NULL);
                        break;
                        //удаление элемента
                case 3: std::cout << "\nPlease select a nomber of list you want to delete" << std::endl;
                        std::cin >> n;
                        i=0;
                        for (tmp = phead; tmp != NULL; tmp = tmp->next)
                        {
                            i++;
                            if (i == n-1){
                                if (tmp != NULL){
                                    if (tmp == phead){
                                        phead = tmp->next;
                                        delete (tmp);
                                        tmp = phead; break;
                                    }
                                    else{
                                        Node *tmp1 = new Node();
                                        tmp1->Country = (tmp->next)->Country;
                                        tmp1->City = (tmp->next)->City;
                                        tmp1->City_people = (tmp->next)->City_people;
                                        tmp->next = (tmp->next)->next;
                                        tmp = tmp1;
                                        delete (tmp1); break;
                                    }
                                }
                                else break;
                            }
                        };
                        break;
                        //вывод двух списков по признаку: Страна: города с населением <n, города с населением >= n
                case 4: std::cout << "\nPlease select a key from country: ";
                        std::cin >> key_Country;
                        std::cout << "\nPlease select a key from City people amount: ";
                        std::cin >> key_City_peoiple;
                        std::cout <<"\nOutput List where people of Cities < " << key_City_peoiple;
                        std::cout << std::endl;
                        for (tmp = phead; tmp!=NULL; tmp=tmp->next)
                        {
                                if (tmp->Country == key_Country){
                                    if (tmp->City_people < key_City_peoiple){
                                        std::cout << tmp->Country << "  " << tmp->City << "  ";
                                        std::cout << tmp->City_people << std::endl; 
                                    }
                                }
                        }
                        std::cout <<"\nOutput List where people of Cities >= " << key_City_peoiple;
                        std::cout << std::endl;
                        for (tmp = phead; tmp!=NULL; tmp=tmp->next)
                        {
                            if (tmp->Country == key_Country){
                                if (tmp->City_people >= key_City_peoiple){
                                    std::cout << tmp->Country << "  " << tmp->City << "  ";
                                    std::cout << tmp->City_people << std::endl; 
                                }
                            }
                        }
                        break;
                        //подсчет всех жителей в списке
                case 5: std::cout << "\n5: The count all people of the list is: ";
                        for (tmp = phead; tmp != NULL; tmp = tmp->next)
                        {
                            count = count + tmp->City_people;
                        }
                        std::cout << count << std::endl;
                        //выход из программы
                case 6: break;
                        //сообщение об ошибке при вводе ключа
                default: std::cout << "Mabe you mistake? please, try again." <<std::endl;
        }
    } while (k!=6);
return 0;
}
0
Aneron
158 / 157 / 12
Регистрация: 20.04.2010
Сообщений: 570
17.06.2011, 13:05 #14
удаление произвольного элемента.
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
case 3: 
    std::cout << "\nPlease select a nomber of list you want to delete" << std::endl;
    std::cin >> n;
    i = 1;
    for (tmp = phead; tmp != NULL;)
    {
        if (i == n)
        {
            if (tmp == phead)
            {                   
                delete phead;
                phead = NULL;
                break;
            }
            else
            {
                if(tmp->next)
                    tmp_pr->next = tmp->next;
                else
                    tmp_pr->next = NULL;
                delete tmp; 
                break;
            }
        }
        ++i;
        tmp_pr = tmp;
        tmp = tmp->next;
    }           
    break;
Добавлено через 5 минут
Цитата Сообщение от OcbMuHor Посмотреть сообщение
распечатка списка (поток вывода уточняю, скорее всего вывод на принтер)
скорее всего в файл. сомневаюсь что вы сможете сделать распечатку на принтер. думаю и препод в этом сомневается. поэтому вряд ли бы дал распечатку на принтере в кач-ве задания.
0
OcbMuHor
Заблокирован
17.06.2011, 13:12  [ТС] #15
скорее всего в файл. сомневаюсь что вы сможете сделать распечатку на принтер. думаю и препод в этом сомневается. поэтому вряд ли бы дал распечатку на принтере в кач-ве задания.
Да, там вывод в задании дефолт. А сели бы и на принтер? с файловым i\o я работал с принтером должно быть по аналогии как-то? чисто теоретически, интересуюсь.

По кейсу: если вопрос стоит так что удалить из линейного списка можно только последний элемент, то лишние переменные тут вообще получаются ни к месту?
0
17.06.2011, 13:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2011, 13:12
Привет! Вот еще темы с ответами:

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Добавить в класс "Односвязный список" следующие функции - C++
1. Добавить в класс &quot;Односвязный список&quot; следующие функции: вставка элемента в заданную позицию, удаление элемента по заданной позиции,...

Обработка пользовательского класса "Односвязный линейный список" - C++
Доброго времени суток. Хочу написать программу для обработки односвязного линейного списка (ОЛС) которая заключается в изменении начального...

Реализовать пользовательский класс "Двунаправленный список"; реализовать добавление и удаление элементов - C++
Записи в линейном списке содержат ключевое поле типа *char(строка символов). Сформировать двунаправленный список. Удалить К элементов с...


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

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

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