Заблокирован
1

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

15.06.2011, 11:28. Показов 2098. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2011, 11:28
Ответы с готовыми решениями:

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

Реализовывал односвязный список. Выдает ошибку: "синтаксическая ошибка:ожидался токен "<Нет данных>,а не <нет данных>""
#include&lt;iostream&gt; #include&lt;string&gt; #include &lt;stdio.h&gt; using namespace std; template&lt;typename...

Двухуровневый список выбора (Spinner) "Страна->Город" c применением SQLite
Подскажите пожалуйста в каком виде создавать данные в БД и как правильно переработать файлы чтоб...

Проверить, правильно ли заполнено поле "Город, страна"
Всем доброго времени суток. Собственно, нужно проверить соответствует ли следующему шаблону текст:...

16
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
15.06.2011, 11:37 2
это тупо описание класса. и нет возможности проверить его работоспособность.
напиши программу чтоб проверить твой класс. потом посмотрим.
0
Заблокирован
15.06.2011, 12:10  [ТС] 3
Цитата Сообщение от Aneron Посмотреть сообщение
это тупо описание класса. и нет возможности проверить его работоспособность.
напиши программу чтоб проверить твой класс. потом посмотрим.
Я конечно мало что понимаю, всё грызем, грызём... но что мешает описать все функции в теле класса?
0
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
15.06.2011, 17:00 4
OcbMuHor, как ваш пост стыкуется с предложением описать функцию main?
0
Заблокирован
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
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
15.06.2011, 17:23 6
OcbMuHor, не понял, а в честь чего вы так резко перешли от объектно-ориентированного к процедурному программированию?
После реализации функций их надо проверить. Как вы собрались проверять их без точки входа - функции main.
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
15.06.2011, 17:23 7
тупой и банальный вопрос. как ты будешь проверять свой код на корректность работы?
0
Заблокирован
15.06.2011, 17:45  [ТС] 8
Цитата Сообщение от Aneron Посмотреть сообщение
тупой и банальный вопрос. как ты будешь проверять свой код на корректность работы?
Это вопрос риторический...
0
Заблокирован
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
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
16.06.2011, 21:27 10
OcbMuHor, 1. Про циклы слышали?
0
Заблокирован
16.06.2011, 21:32  [ТС] 11
Цитата Сообщение от silent_1991 Посмотреть сообщение
OcbMuHor, 1. Про циклы слышали?
В чем издевка?
0
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
16.06.2011, 21:36 12
OcbMuHor, какие издёвки? Вполне конкретный вопрос. В вашей формулировке "как бы так сообразить можно было рекурсию на switch, т.е. по завершении выполнения одного из условий или ввода не того символа вернуть выполнение программы на строку №33" - это то же самое, что в моей "цикл".
0
Заблокирован
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
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
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
Заблокирован
17.06.2011, 13:12  [ТС] 15
скорее всего в файл. сомневаюсь что вы сможете сделать распечатку на принтер. думаю и препод в этом сомневается. поэтому вряд ли бы дал распечатку на принтере в кач-ве задания.
Да, там вывод в задании дефолт. А сели бы и на принтер? с файловым i\o я работал с принтером должно быть по аналогии как-то? чисто теоретически, интересуюсь.

По кейсу: если вопрос стоит так что удалить из линейного списка можно только последний элемент, то лишние переменные тут вообще получаются ни к месту?
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
17.06.2011, 13:23 16
tmp_pr - указатель на предыдущий элемент.
если даже ты будешь удалять последний элемент, то тебе так или иначе нужно перебить связь с предпоследним. иначе могут возникнуть ошибки.
0
Заблокирован
17.06.2011, 22:02  [ТС] 17
Цитата Сообщение от Aneron Посмотреть сообщение
tmp_pr - указатель на предыдущий элемент.
если даже ты будешь удалять последний элемент, то тебе так или иначе нужно перебить связь с предпоследним. иначе могут возникнуть ошибки.
Я только к вечеру понял что к чему и как работает. Все не мог понять, а дело в том что указатели неизменны, а я во всю им пытаюсь присвоить новые значения. Топик можно закрывать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2011, 22:02
Помогаю со студенческими работами здесь

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

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

Абстрактный тип данных "Односвязный список"
Создание головной функции односвязного списка и дополнительных функций: 1)Сумму элементов массива...

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


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

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

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