8 / 6 / 3
Регистрация: 14.04.2019
Сообщений: 71
1

Удаление элемента из списка

01.10.2019, 19:08. Показов 1622. Ответов 4

Author24 — интернет-сервис помощи студентам
Не фуричит функция удаления элемента из списка. Пытался по-разному, последняя ф-ция которая более менее работает, но не возвращает указатель на первый елемент. Очистка списка тоже не работает
P.s > если кто знает, как очистить весь список - поделитесь примером)
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <windows.h>
#include <iostream>
#include <string> 
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <fstream>
#include <algorithm>
#include <conio.h>
#include <iomanip>
 
using namespace std;
 
struct Data {
    string Name;    // прізвище, ініціали;
    string Gender;  // стать
    string Spec;    // назва спеціальності
    int Group;      // номер групи
    int Exam[3];    // результати вступних іспити з трьох предметів(масив з трьох елементів)
};
 
struct List {
    Data* list;
    List* next, * prev;
};
 
 
List* create_list() {
    List* list = (List*)malloc(sizeof(List));
    list->list = NULL;
    list->next = NULL;
    list->prev = NULL;
    return list;
}
 
List* delete_list(List* oldlist) {
    if (oldlist->next == NULL) {
        oldlist->prev->next = NULL;
        free(oldlist);
        return 0;
    }
    delete_list(oldlist->next);
}// ne robit
 
Data* write_data(Data* r) {
    cout << "Прізвище та ініціали: "; getline(cin, r->Name);
    /*cout << "Стать(чол./жін.): "; getline(cin, r->Gender);
    cout << "Назва спеціальності: "; getline(cin, r->Spec);
    cout << "Номер групи: "; cin >> r->Group;
    for (int i = 0; i < 3; i++) {
        cout << "Оцінка за " << i + 1 << " екзамен: "; cin >> r->Exam[i];
    }*/
    return r;
} // Заповнення поля з данними
 
int chek_list(List* llist) {
    List(*tlist);
    int size = 0;
    for (tlist = llist; tlist != NULL; tlist = tlist->next) size++;
    return size;
} // перевірка кількості елементів в списку
 
void txt_print(List* q) {
    cout << q->list->Name << " ";
    /*cout << q->list->Gender << " ";
    cout << q->list->Spec << " ";
    cout << q->list->Group << " ";
    cout << q->list->Exam[0] << " "
        << q->list->Exam[1] << " "
        << q->list->Exam[2] << " "
        << endl;*/
}
 
void printf_list(List* q) {
    List* temp = q;
    if (temp) txt_print(temp);
    else return;
    printf_list(temp->next);
} // друк цілого списку
 
void printf_element(List* q, int pos) {
    if (pos <= chek_list(q) && pos > 0) {
        List(*temp) = q;
        for (int i = 0; i != pos - 1; i++)
            temp = temp->next;
        txt_print(temp);
    }
    else if (pos < 0) cout << "Error. Елемент в списку не може бути від'ємним." << endl;
    else cout << "Error. Неможливо вивести елемент, якого немає в списку." << endl;
 
}
 
List* addstart(List* q) {
    Data* d_temp = new Data{};
    write_data(d_temp);
    q->list = d_temp;
    q->next = NULL;
    q->prev = NULL;
    return q;
}; // v samom na4ale//минус
 
List* add(List* oldlist, int pos = 0) {
    if (pos < 0) {
        cout << "Позиція списку не може бути від'ємною" << endl;
        return oldlist;
    }
    if (pos > chek_list(oldlist)) {
        cout << "Error! Позиція повинна бути не більше, ніж розмір списку." << endl;
        return oldlist;
    }
    List(*start) = oldlist;
    List* newlist = (List*)malloc(sizeof(List));
    Data* d_temp = new Data{};
    write_data(d_temp);
    newlist->list = d_temp;
    if (pos == 0) {
        newlist->next = oldlist;
        newlist->prev = NULL;
        oldlist->prev = newlist;
        return newlist;
    } // Якщо додаємо в початок списку
    if (pos == chek_list(oldlist)) {
        for (int i = 0; oldlist->next != NULL; oldlist->next)
            oldlist = oldlist->next;
        newlist->next = NULL;
        newlist->prev = oldlist;
        oldlist->next = newlist;
    } // Якщо додаємо в кінець списку
    if (pos > 0 && pos < chek_list(oldlist)) {
        for (int i = 0; i != pos - 1; i++)
            oldlist = oldlist->next;
        newlist->next = oldlist->next;
        oldlist->next = newlist;
        newlist->prev = oldlist;
    } // Якщо додаємо в середину списку
    return start;
}
 
List* del(List* oldlist, int pos = 0) {
    if (pos < 0) {
        cout << "Позиція списку не може бути від'ємною" << endl;
        return oldlist;
    }
    if (pos > chek_list(oldlist)) {
        cout << "Error! Позиція повинна бути не більше, ніж розмір списку." << endl;
        return oldlist;
    }
    for (int i = 0; i != pos - 1; i++)
        oldlist = oldlist->next;
    List* lst = oldlist;
    struct List* prev, * next;
    prev = lst->prev; // узел, предшествующий lst
    next = lst->next; // узел, следующий за lst
    if (prev != NULL)
        prev->next = lst->next; // переставляем указатель
    if (next != NULL)
        next->prev = lst->prev; // переставляем указатель
    free(lst); // освобождаем память удаляемого элемента
    //prev = oldlist;
    return(oldlist);
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    List* students = create_list();
    if (chek_list(students) == 0) cout << "Spisok pust" << endl;
    students = addstart(students);
    printf_list(students);
    students = add(students);
    if (chek_list(students) == 0) cout << "Spisok pust" << endl;
    students = add(students);
    students = add(students);
    if (chek_list(students) == 0) cout << "Spisok pust" << endl;
    cout << "\t" << chek_list(students);
    students = add(students, 3);
    if (chek_list(students) == 0) cout << "Spisok pust" << endl;
    printf_list(students);
    cout << endl << endl << endl;
    printf_element(students, 8);
    cout << endl << endl << endl;
    students = del(students, 5);
    //delete_list(students);
    cout << endl;
    printf_list(students);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2019, 19:08
Ответы с готовыми решениями:

Реализация списка.Удаление хвостового элемента.Поиск элемента
Всем привет,мое задание выглядит так : В класс List&lt;T&gt; из классной работы добавить следующие...

Удаление элемента списка и всего списка
Компилируется, но не работает. Что и как исправить? #include &lt;cstdlib&gt; #include &lt;iostream&gt;...

Удаление элемента из списка и поиск элемента
Нужно удалить определенный элемент из списка. Найти элемент в списк и вывести на него всю...

Удаление элемента из списка
Нужно удалить из списка элемент, стоящий после элемента на который указывает Р. Очень срочно надо!...

4
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
01.10.2019, 20:12 2
Цитата Сообщение от _NeznaIka_ Посмотреть сообщение
если кто знает, как очистить весь список - поделитесь примером
как-то так:
C++
1
2
3
4
5
6
7
void rmv(List* head) {
    while (head != NULL) {
        List* tmp = head;
        head = head->next;
        delete tmp;
    }
}
в эту функцию передай указатель на первый элемент списка
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
01.10.2019, 20:15 3
Цитата Сообщение от _NeznaIka_ Посмотреть сообщение
P.s > если кто знает, как очистить весь список - поделитесь примером)
Двусвязные списки без ООП
0
8 / 6 / 3
Регистрация: 14.04.2019
Сообщений: 71
01.10.2019, 21:06  [ТС] 4
Цитата Сообщение от ibse Посмотреть сообщение
как-то так:
C++
1
2
3
4
5
6
7
void rmv(List* head) {
    while (head != NULL) {
        List* tmp = head;
        head = head->next;
        delete tmp;
    }
}
в эту функцию передай указатель на первый элемент списка
Испытал данные строки кода, вроде как работает) Но вот у меня появилась другая проблемка, которая меня ещё больше беспокоит. Вот есть у меня функция проверки списка:
C++
1
2
3
4
5
6
int chek_list(List* llist) {
    List(*tlist);
    int size = 0;
    for (tlist = llist; tlist != NULL; tlist = tlist->next) size++;
    return size;
}
Возможно функция полная чушь, но после удаления всего списка она выдает ошибку. Есть ли вариант обхода ошибки, кроме того, как после работы вашей функции задать указателям по нулю?
Или я уже занимаюсь не тем, чем нужно?
0
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
02.10.2019, 11:49 5
_NeznaIka_,
C++
1
2
3
4
5
6
7
void rmv(List*& head) {
    while (head != NULL) {
        List* tmp = head;
        head = head->next;
        delete tmp;
    }
}
0
02.10.2019, 11:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2019, 11:49
Помогаю со студенческими работами здесь

Удаление элемента из списка
В чем ошибка? Проблема с функцией Tree_Delete .exe вызвал срабатывание точки останова., произошло...

Удаление элемента из списка
Нужно удалить всех студентов с оценками 2. Entry *begin = new Entry; int mark=2; Entry...

Удаление элемента из списка
Здравствуйте, нужна помощь, программа, выполняющая следующие задания на основе двусвязного списка....

Удаление элемента из списка
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; struct...


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

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

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