С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Писарев Иван
0 / 0 / 0
Регистрация: 05.09.2012
Сообщений: 44
#1

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

05.09.2012, 15:37. Просмотров 398. Ответов 6
Метки нет (Все метки)

Здравствуйте! Передо мной стоит следующая задача: необходимо создать список, вывести его на экран и удалить. Программу необходимо запускать несколько раз, вот в этом и возник ступор. Дело в том, что программа создает список, выводит его на экран и удаляет первый раз вроде исправно, но второй раз программа выдает ошибку на выводе списка(как я понял, либо программа не правильно удаляет связанный список, либо во второй раз она его не правильно создает). Вот код:

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;
    }
}
Прошу прощения, если данная тема уже поднималась.
Заранее большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2012, 15:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемы с удалением связанного списка(С++) (C++):

Окончание связанного списка - C++
Скажите, пожалуйста, как в моём случае можно поступить: выйти из цикла, если нажатием Enter ничего не вводится и выдавать ошибку, если...

Удаление элемента из связанного списка - C++
Нужно удалить все элементы списка кратные 3. void Del() { if (head == NULL) cout &lt;&lt; &quot;\nСписок пуст\n\n&quot;; else { DoubleList...

Стек на основе связанного списка C++ - C++
Привет:) Мне нужно разработать функции занесения и извлечения данных стека на основе связанного списка!на основе массива уже написала, а...

Реализация связанного списка - нужны пояснения - C++
#include &lt;iostream&gt; using namespace std; class cool { public: int number; cool* next; ...

Реализация очереди на основе связанного списка - C++
Реализация очереди на основе связанного списка в строках хэдэра tmp-&gt;ch.name = ch1.name; tmp-&gt;ch.surname = ch1.surname; ...

Перегрузка оператора индексации для связанного списка - C++
Доброго времени суток!:) Требуется перегрузить оператор индексации для связанного списка, я так понимаю в роли списка должны выступать...

6
alsav22
5428 / 4823 / 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;
}
Хотя ошибку это не убирает.
1
Писарев Иван
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;
}
:
Так оно на самом деле и есть. Просто в задании нужно было еще ставить так называемую "защиту от дурака" и сделать сортировку, но в целях экономии я это вырезал все(сортировка работает верно). Спасибо за замечание.
0
alsav22
5428 / 4823 / 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;
}
1
Писарев Иван
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;
}
Огромнейшее вам спасибо!
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
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;    <--- вот это уже лишнее, хотя работать все равно будет :-)
}
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.09.2012, 17:20 #7
Цитата Сообщение от CheshireCat Посмотреть сообщение
вот это уже лишнее, хотя работать все равно будет
Верно.
0
05.09.2012, 17:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 17:20
Привет! Вот еще темы с ответами:

Как наиболее быстро определить зацикливание связанного списка? (a => b => c => d => e => a) - C++
You have a pointer to some element in a linked list (a =&gt; b =&gt; c =&gt; d =&gt; e). What is the fastest way to tell if there is a loop in the...

Как сделать ввод данных в файл с использованием связанного списка - C++
у меня есть односторонний связанный список который расставляет данные в порядке увеличения. данные это порядковый номер персонала. ...

Из заданного массива целых чисел, который представлен в виде связанного списка, удалить все нулевые элементы, если они существуют - C++
Помогите пожалуйста написать программу: Из заданного массива целых чисел, который представлен в виде связанного списка, удалить все...

Сортировка связанного двумерного массива - C++
Есть входные данные вида: 1112 576 1113 577 1114 578 1115 579 1116 580 Данные - это x и y координаты. Их необходимо...


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

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

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