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

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

Войти
Регистрация
Восстановить пароль
 
Maratovich
13 / 17 / 1
Регистрация: 05.09.2012
Сообщений: 210
#1

Не работает удаление в списке - C++

23.12.2012, 22:47. Просмотров 267. Ответов 3
Метки нет (Все метки)

Извините за очень заеженную тему, но не хватает ума понять как элементы удаляются из списка.
Вот код, тут все функции работают кроме удаления. Если не трудно можете объяснить как их удалять правильно
и сразу показать.
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
#include <iostream>
using namespace std;
 
struct List
{
    int value;
    List *next;
};
 
List *add(List *end)
{
    if(end == NULL)
    {
        end = new List;
    }
    else
    {
        end->next = new List;
        end = end->next;
 
    }
    cin>>end->value;
    end->next = NULL;
    return end;
}
 
List *find(List *beg, int value)
{
    List *index;
    while(beg != NULL)
    {
        if(beg->value == value)
        {
            index = beg;
            break;
        }
        else
        {
            index = NULL;
        }
        beg = beg->next;
    }
    return index;
}
 
 
bool del(List *beg, int value)
{
    List *new_beg;
    new_beg = find(beg,value);
    if(new_beg != NULL) 
    {
        new_beg = beg->next;
        delete beg;
        beg = new_beg;
        return true;        
    }
    return false;
}
 
void show(List *beg)
{
    while(beg != NULL)
    {
        cout<<beg->value<<endl;
        beg = beg->next;
    }
}
 
int main()
{   
    List *beg = NULL, *end = NULL;
    int element;
    if(beg == NULL) 
    {
        beg = add(end);
        end = beg;
    }
    else
    {
        end = add(end);
    }   
 
 
    show(beg);  
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2012, 22:47     Не работает удаление в списке
Посмотрите здесь:

В программе не работает 1)удаление элемента, последнего в списке-зависает и C++
удаление и поиск в списке C++
C++ Удаление элементов в списке
C++ Удаление похожих строк в списке
Удаление элемента в списке C++
Удаление в списке C++
C++ Удаление элемента в списке
C++ Удаление элемента в списке
Добавление и удаление элемента в списке C++
C++ Удаление c параметром в динамическом списке
Удаление повторяющихся значений в списке C++
Поиск и удаление в односвязном списке C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
24.12.2012, 00:23     Не работает удаление в списке #2
Цитата Сообщение от Maratovich Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
List *find(List *beg, int value)
{
* * List *index;
* * while(beg != NULL)
* * {
* * * * if(beg->value == value)
* * * * {
* * * * * * index = beg;
* * * * * * break;
* * * * }
* * * * else
* * * * {
* * * * * * index = NULL;
* * * * }
* * * * beg = beg->next;
* * }
* * return index;
}
У тебя и эта функция неверно работает и в большинстве случаев возвращает вместо найденного NULL!

Добавлено через 3 минуты
Надо так!
C++
1
2
3
4
5
6
7
List *find(List *beg, int value)
{
    while(beg != NULL)
        if(beg->value == value) return beg;
        else beg=beg->next;
    return NULL;
}
Добавлено через 1 минуту
Цитата Сообщение от Maratovich Посмотреть сообщение
beg = new_beg;
ты что, не знаешь, что изменение аргументов функции не влияет на них после выхода из неё, даже если передаётся указатель?
Maratovich
13 / 17 / 1
Регистрация: 05.09.2012
Сообщений: 210
24.12.2012, 20:41  [ТС]     Не работает удаление в списке #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты что, не знаешь, что изменение аргументов функции не влияет на них после выхода из неё, даже если передаётся указатель?
про это я знаю, просто такая привычка подстраховываться - вдруг что...
за счет исправления функции find спасибо, учту.

а как насчет функции delete мог бы ты мне ее объяснить - показать.
David Sylva
 Аватар для David Sylva
1283 / 945 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
24.12.2012, 21:25     Не работает удаление в списке #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
#include <iostream> 
 
struct node 
{  
    int data; 
    node* next; 
}; 
 
class linklist 
{ 
private: 
    node* first; 
public: 
    linklist() { first = NULL; } 
    void additem(int d); 
    void show(); 
    void delet(); // функция удаление конкретного элемента из списка
}; 
 
void linklist::additem(int d) 
{  
    node* newnode = new node; // создаём новый элемент списка
    newnode->data = d; // присваиваем полю data, значение переданное в как аргумент функции
    if(first == NULL) // если элемент первый в списки, то есть first равно NULL
    {
        newnode->next = first; // указателю на следующий элемент, присваиваем значение хранящиеся в указатели first
        first = newnode;       // присваиваем указателю first, значение на новый элемент списка
    }  
    else // ели элемент не первый в списке
    { 
        node* current = first; // создаём элемент текущей и присвоим ему firts, то есть начало списка 
        while(current->next!=NULL) // цикл идёт до тех пор пока указатель элемента не равен значению NULL, то есть до конца списка  
              current = current->next;// переходим от узла к узлу
        current->next = newnode; // когда мы достигли конца списка, элемент расположенный в конце, указывает на наш новый элемент
        newnode->next = NULL;    // новый элемент указывает, на NULL, то есть на конец списка
    } 
}
 
void linklist::show() 
{ 
    node* current = first; 
    while(current) 
    { 
        std::cout << current->data << " "; 
        current = current->next;
    }  
}  
 
void linklist::delet() // функция удаления конкретного элемента из списка
{   
    int n = 3;         // номер элемента, который удаляем
    int count = 1;     // счётчик элементов, начинаем с первого элемента
    node* current = first; // текущий элемент
    node* temp;             // временный элемент
 
    while(count!=n) // проходим циклом, пока не дойдём до элемента с искомым номером
    {   
        temp = current; // временному присваиваем текущий
        current = current->next; // переход на следующий узел
        count++;                 // увеличиваем счётчик
    }   
    temp->next = current->next; // временный ( то есть элемент, стоящий перед текущим, указывает на элемент идущий после текущего
    delete current; // удаляем текущий
}
 
int main() 
{ 
    linklist li; 
    li.additem(11); 
    li.additem(12); 
    li.additem(13); 
    li.additem(14); 
    li.additem(15); 
 
    li.show(); 
    std::cout << std::endl;
    li.delet(); 
    std::cout << std::endl;
    li.show(); 
    
}
Yandex
Объявления
24.12.2012, 21:25     Не работает удаление в списке
Ответ Создать тему
Опции темы

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