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

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

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

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

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

В программе не работает 1)удаление элемента, последнего в списке-зависает и - C++
В программе не работает 1)удаление элемента, последнего в списке-зависает и нужна операция обработки -обмен местами элементов с заданными...

Удаление в списке - C++
Реализован метод удаления после какого-то элемента в спике: void remove(Node *where) { if (nodes&gt;1 &amp;&amp; where-&gt;next != 0) { ...

Удаление элементов в списке - C++
Помогите написать программу(скорее функцию), где нужно удалить в списке элементы с позиции N по K. Список циклический однонаправленный. ...

Удаление элемента в списке - C++
Привет, всем снова! Помогите, пожалуйста, разобраться теперь уже с удалением элемента из линейного односвязного списка с максимальным...

удаление и поиск в списке - C++
Подскажите, как реализовать функции удаления и поиска числа в списке? Нужно, что бы удаление происходило по индексу элемента, а поиск по...

Удаление элемента в списке - C++
Необходимо реализовать метод удаления элемента из списка не после определённого элемента (как сделано в коде), а по индексу этого элемента ...

3
Kuzia domovenok
2042 / 1887 / 172
Регистрация: 25.03.2012
Сообщений: 6,499
Записей в блоге: 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;
ты что, не знаешь, что изменение аргументов функции не влияет на них после выхода из неё, даже если передаётся указатель?
0
Maratovich
13 / 17 / 1
Регистрация: 05.09.2012
Сообщений: 210
24.12.2012, 20:41  [ТС] #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты что, не знаешь, что изменение аргументов функции не влияет на них после выхода из неё, даже если передаётся указатель?
про это я знаю, просто такая привычка подстраховываться - вдруг что...
за счет исправления функции find спасибо, учту.

а как насчет функции delete мог бы ты мне ее объяснить - показать.
0
David Sylva
1291 / 953 / 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(); 
    
}
0
24.12.2012, 21:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2012, 21:25
Привет! Вот еще темы с ответами:

Удаление элемента в списке - C++
Описать функцию, которая удаляет из списка все вхождения элемента Е, значение которого введено с клавиатуры. это само задание. ...

Удаление c параметром в динамическом списке - C++
Всем привет. У меня удаляет элемент, если он первый в списке. Не получается удалить элемент, который находится в середине или в конце. Было...

Удаление головы в Связном списке C++ - C++
Ребят, в чем ошибка? Вроде все проверил, но почему-то вылетает с ошибкой при попытке удалении головы списка, не могу понять в чем проблема....

Удаление по ключу в односвязном списке - C++
Написал алгоритм удаления по ключу в линейном, односвязном списке, но он не удаляет, а коверкает записи. Помогите разобраться.. ...


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

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

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