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

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

Восстановить пароль Регистрация
 
Maratovich
13 / 17 / 1
Регистрация: 05.09.2012
Сообщений: 210
23.12.2012, 22:47     Не работает удаление в списке #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
#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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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
1280 / 942 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
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     Не работает удаление в списке
Ответ Создать тему
Опции темы

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