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

Проблемы с удалением связанного списка(С++) - C++

Восстановить пароль Регистрация
 
Писарев Иван
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 44
05.09.2012, 15:37     Проблемы с удалением связанного списка(С++) #1
Здравствуйте! Передо мной стоит следующая задача: необходимо создать список, вывести его на экран и удалить. Программу необходимо запускать несколько раз, вот в этом и возник ступор. Дело в том, что программа создает список, выводит его на экран и удаляет первый раз вроде исправно, но второй раз программа выдает ошибку на выводе списка(как я понял, либо программа не правильно удаляет связанный список, либо во второй раз она его не правильно создает). Вот код:

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>
#include <fstream>
#include <conio.h>
#include <iomanip>
#include <time.h>
#include <string>
 
 
using namespace std;
 
struct rabotnik
{
    string name;
    int staj;
    int zarplata;
    string doljnost;
    rabotnik* next;
};
 
rabotnik* head;
 
rabotnik* zapis(rabotnik *cur,  string P1, string P2, int p1, int p2)
{
    rabotnik* cur2 = new rabotnik; 
    cur2->name =P1; 
    cur2->doljnost=P2;
    cur2->staj=p1;
    cur2->zarplata=p2;
    cur2->next=NULL;
    cur=cur2;
    cur->next = head;
    head = cur;
    return cur;
}
 
rabotnik* promejutok(rabotnik* cur, int vopros)
{
    string P1, P2;
    int p1, p2;
    for (int i=0; i<vopros; i++)
    {
        cout<<endl<<"Введите имя работника ";
        cin >> P1;
        cout<<endl<<"Введите должность работника ";
        cin >> P2;
        cout<<endl<<"Введите стаж работника ";
        cin >> p1;
        while(p1>60||p1<0)
        cout<<endl<<"Введите зар.плату работника(в рублях) ";
        cin >> p2;
        zapis  (cur, P1, P2, p1, p2);
    }
    return(cur);
}
 
void Vivod(rabotnik* q)
{
    q=head;
    for (;q;)
    {
        cout << setw(15) << q->name << setw(15) << q->doljnost << setw(15) << q->staj << setw(15) << q->zarplata ;
        q=q->next;
    }
    cout<<endl;
}
 
void udalenie()
{
    rabotnik* prom;
    do
    {
        prom=head->next;
        delete head;
        head=prom;
    }while (head->next);
    delete head;
}
 
void main()
{
    int vopros=1, vopros1;
    setlocale(0, "");
    system("color F0");
    while(vopros==1)
    {
        cout<<"Введите кол-во рабочих на предприятии ";
        cin>>vopros;
        rabotnik* cur;
        cur=head;
        promejutok(cur, vopros);
        rabotnik* q=new rabotnik;
        Vivod(q);
        udalenie();
        cout<<"Если хотите запустить программу снова, нажмите 1 ";
        cout<<endl<<"ВНИМАНИЕ!";
        cout<<"Если Вы нажмете другую кнопку, программа завершит действие ";
        cin>>vopros;
    }
}
Прошу прощения, если данная тема уже поднималась.
Заранее большое спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2012, 16:14     Проблемы с удалением связанного списка(С++) #2
Цитата Сообщение от Писарев Иван Посмотреть сообщение
while(p1>60||p1<0)
cout<<endl<<"Введите зар.плату работника(в рублях) ";
Что это за странный цикл, в котором ничего не меняется? Может так нужно ?
C++
1
2
3
4
5
if (p1 < 60 && p1 > 0)
{
    cout << endl << "Введите зар.плату работника(в рублях) ";
    cin >> p2;
}
Хотя ошибку это не убирает.
Писарев Иван
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 44
05.09.2012, 16:21  [ТС]     Проблемы с удалением связанного списка(С++) #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Что это за странный цикл, в котором ничего не меняется? Может так нужно ?
C++
1
2
3
4
5
if (p1 < 60 && p1 > 0)
{
    cout << endl << "Введите зар.плату работника(в рублях) ";
    cin >> p2;
}
:
Так оно на самом деле и есть. Просто в задании нужно было еще ставить так называемую "защиту от дурака" и сделать сортировку, но в целях экономии я это вырезал все(сортировка работает верно). Спасибо за замечание.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2012, 16:43     Проблемы с удалением связанного списка(С++) #4
Если так, то, вроде бы, работает:
C++
1
2
3
4
5
6
7
8
9
10
11
void udalenie()
{
    rabotnik* prom;
    do
    {
        prom = head -> next;
        delete head;
        head = prom;
    } while (head);
    delete head;
}
Писарев Иван
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 44
05.09.2012, 16:55  [ТС]     Проблемы с удалением связанного списка(С++) #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Если так, то, вроде бы, работает:
C++
1
2
3
4
5
6
7
8
9
10
11
void udalenie()
{
    rabotnik* prom;
    do
    {
        prom = head -> next;
        delete head;
        head = prom;
    } while (head);
    delete head;
}
Огромнейшее вам спасибо!
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
05.09.2012, 17:11     Проблемы с удалением связанного списка(С++) #6
C++
1
2
3
4
5
6
7
8
9
10
11
void udalenie()
{
    rabotnik* prom;
    do
    {
        prom = head -> next;
        delete head;
        head = prom;
    } while (head);
    // delete head;    <--- вот это уже лишнее, хотя работать все равно будет :-)
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 17:20     Проблемы с удалением связанного списка(С++)
Еще ссылки по теме:

C++ Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка
Реализация очереди на основе связанного списка C++
C++ Как наиболее быстро определить зацикливание связанного списка? (a => b => c => d => e => a)

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2012, 17:20     Проблемы с удалением связанного списка(С++) #7
Цитата Сообщение от CheshireCat Посмотреть сообщение
вот это уже лишнее, хотя работать все равно будет
Верно.
Yandex
Объявления
05.09.2012, 17:20     Проблемы с удалением связанного списка(С++)
Ответ Создать тему
Опции темы

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