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

Стеки и удаление конкретного элемента из стека - C++

Восстановить пароль Регистрация
 
Wolferine
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 10
24.05.2013, 19:17     Стеки и удаление конкретного элемента из стека #1
Здравствуйте, уважаемые программисты и начинающие как я. Помогите, пожалуйста с одной функцией. В общем задача такова:
Имеется два списка (в моем случае это список таксистов на маршруте и на базе), структура каждого таксиста состоит из его номера и его фамилии. Сначала пользователь создает список таксистов на маршруте и на базе. Программа может выводить эти списки по желанию все того же пользователя. Но еще возможны 2 случая:
1) Из базы может выехать таксист. Логично предположить, что его нужно удалить из списка "таксисты на базе" и добавить в список "таксисты на маршруте".
Ну и обратное:
2) В базу может приехать таксист. Его нужно удалить из списка "таксисты на маршруте" и добавить в список "таксисты на базе".

Вся сложность появилась при написании функции удаления из списка (программу пишу поэтапно и добавление в список еще не писал). В функцию передаю номер таксиста, ищу его в списке и пытаюсь удалить. Прилагаю код:

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
//прога создает стэк для таксистов на базе, для таксистов на маршруте
//выдает на экран эти стеки
//осталось выполнить стирание - добавление таксистов в стек
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <locale.h>
#include <conio.h>
using namespace std;
struct spis
{
    int num;
    char fio[10];
    spis *next;
};
int r,// r - количество таксистов на маршруте (road)
    b;// b - количество таксистов на базе (base)
spis *create_stack(int n); //функция создания списка таксистов
spis *delete_taxi(spis *head, int num_to_delete); //удаление таксиста из списка (работает некорректно)
void print_spisok (spis *head);//вывод списка
 
int main()
{
    setlocale(LC_ALL, "rus");
    spis *taxi_on_road, *taxi_on_base;//два списка
    while(true)
    {
        system("cls");
        cout<<" 1 - Создать базу таксистов, находящихся на маршруте\n";
        cout<<" 2 - Создать базу таксистов, находящихся на базе\n\n";
        cout<<" 3 - Вывести базу таксистов, находящихся на маршруте\n";
        cout<<" 4 - Вывести базу таксистов, находящихся на базе\n\n";
        cout<<" 5 - Из базы выехал таксист\n";
        cout<<" 6 - На базу приехал таксист\n\n";
        cout<<" 0 - Выход из программы\n";
        int action;
        scanf("%d", &action);
        switch(action)
        {
            case 1:
                system("cls");
                cout<<"Заполнение списка таксистов, находящихся на маршруте.\n";
                cout<<"Введите количество таксистов в этой базе: ";
                scanf("%d", &r);
                taxi_on_road=create_stack(r);
                cout<<"База создана!";
                getch();
                break;
            case 2:
                system("cls");
                cout<<"Заполнение списка таксистов, находящихся на базе.\n";
                cout<<"Введите количество таксистов в этой базе: ";
                scanf("%d", &b);
                taxi_on_base=create_stack(b);
                cout<<"База создана!";
                getch();
                break;
            case 3:
                system("cls");
                cout<<"Вывод базы таксистов, находящихся на маршруте.\n";
                print_spisok(taxi_on_road);
                getch();
                break;
            case 4:
                system("cls");
                cout<<"Вывод базы таксистов, находящихся на базе.\n";
                print_spisok(taxi_on_base);
                getch();
                break;
            case 5:
                system("cls");
                int num_to_road;
                cout<<"Введите номер таксиста, который выехал из базы: ";
                cin>>num_to_road;
                taxi_on_base=delete_taxi(taxi_on_base,num_to_road);
                //plus_taxi(taxi_on_road,num_to_road);
                getch();
                break;
            case 6:
                system("cls");
                cout<<"СКОРО.";
                getch();
                break;
            case 0:
                system("cls");
                getch();
                return 0;
                break;
        }
    }
}
spis *create_stack(int n){
    spis *p,*head;
    int i=0;
    head=NULL;
    do
    {
        p=new spis;
        p->next=head;
        head=p;
        cout<<"\nТаксист с номером: ";
        scanf("%d", &head->num);
        cout<<"\nЕго ФИО: ";
        scanf("%s", head->fio);
        i++;
    } while (i<n);
    return head;
}
spis *delete_taxi(spis *head, int num_to_delete){
    spis *p;
    p=head;
    for(int i=0; i<b; i++)
    {
        if(p->num==num_to_delete)
        {
            p->next=p->next->next;
            break;
        }
        p=p->next;
    }
    head=p;
    b--;
    return head;
}
void print_spisok (spis *head)
{
    spis *p;
    p=head;
    while (p!=NULL)
    {
        printf("Номер: %4d, ФИО: %10s\n",p->num, p->fio);
        p=p->next;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 19:17     Стеки и удаление конкретного элемента из стека
Посмотрите здесь:

удаление последнего введенного элемента из списка (стека) C++
C++ удаление элемента стека
C++ вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск заданного элемента
C++ Стеки (функция, которая удаляет из стека первый отрицательный элемент, если такой есть)
C++ Описать класс «множество» (добавление и удаление элемента, пересечение, объединение и удаление множеств )
Удаление элементов из стека C++
C++ Удаление элемента стека не работает
Сделать добавление элемента в массив и удаление элемента из массива используя STL C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
24.05.2013, 19:58     Стеки и удаление конкретного элемента из стека #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spis *delete_taxi(spis *head, int num_to_delete){
    spis *p;
    p=head;
    for(int i=0; i<b; i++)
    {
        if(p->num==num_to_delete)
        {
            p->next=p->next->next;
            break;
        }
        p=p->next;
    }
    head=p;//здесь Вы просто "обрубили часть списка". И эта часть осталась висеть в памяти.
    b--;
    return head;
}
я когда-то делал так
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
void delAt(List*& top, int i)
{
    int size = getSize(top);
    if (i >= size || i < 0 )
    {
        throw ListError();
    }
    List* p1 = 0;
    List* p2 = 0;
    if (i == 0)
    {
        p1 = top;
        top = top->next;
        delete [] p1->info;
        delete p1;
        return;
    }
    
    p1 = top;
    for(int j = 0; j < i-1; j++)
    {
        p1 = p1->next;
    }
    p2 = p1->next;
    p1->next = p2->next;
    delete[] p2->info;
    delete p2;
}
Wolferine
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 10
24.05.2013, 20:29  [ТС]     Стеки и удаление конкретного элемента из стека #3
Цитата Сообщение от Ded_Vasilij Посмотреть сообщение
я когда-то делал так
Спасибо за помощь, но ваш метод не подойдет для меня. Насколько я смог прочитать ваш кусочный код, вы удаляете i-тый элемент (то есть элементы в вашем списке идут по порядку), что не совсем совпадает с моей ситуацией. Буду пробовать дальше

Добавлено через 14 минут
UPDATE:
Изменил ваш код на такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void delAt(spis*& top, int num_to_delete)
{
    spis* p1 = 0;
    spis* p2 = 0;
    p1 = top;
    for(int j = 0; p1->num != num_to_delete; j++)
    {
        p1 = p1->next;
    }
    p2 = p1->next;
    p1->next = p2->next;
    delete p2;
}
Здесь num_to_delete - это номер таксиста, которого надо удалить (не порядковый, а личный идентификатор!)

Подаю на вход вот это:
Кликните здесь для просмотра всего текста
Номер: 1, Фамилия: Вавилов
Номер: 2, Фамилия: Денисов
Номер: 3, Фамилия: Иванов
Номер: 4, Фамилия: Петров


Ввожу, удалить таксиста с номером "2"
А на выходе имею вот что:
Кликните здесь для просмотра всего текста
Номер: 2, Фамилия: Денисов
Номер: 3, Фамилия: Иванов
Номер: 4, Фамилия: Петров


То есть удаляется предыдущий таксист, а не тот, который нужен.
Есть мысли, как исправить?
Yandex
Объявления
24.05.2013, 20:29     Стеки и удаление конкретного элемента из стека
Ответ Создать тему
Опции темы

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