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

Двусвязные списки, не могу добавить узел с конца - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Быстрая сортировка Хоара http://www.cyberforum.ru/cpp-beginners/thread261701.html
Быстрая сортировка Хоара (QSort) разбивает массив в ходе сортировки до тех пор, пока размер частичного подмассива не станет равен 1 элементу. Есть подозрение, что лучше бы она не доводила ...
C++ как выглядит в си++ Program kursak; Const Nmax = 5; {Максимальный размер массива} Type Matrix = array of integer;; m:=m; m:=s; end; end http://www.cyberforum.ru/cpp-beginners/thread261679.html
После каждого вхождения символа C в строку S вставить строку S0 C++
Дан символ C и строки S, S0. После каждого вхождения символа C в строку S вставить строку S0. #include <iostream> #include <string.h> using namespace std; const int N=30;
C++ Моделирование алгоритмических вычислений на машинах произвольного доступа
Построить программу для машины произвольного доступа, реализующая вычисления следующих функций, и найти их значения для заданных неотрицательных аргументов. Входные данные заносятся в регистры МДД...
C++ Вычисление значений функции http://www.cyberforum.ru/cpp-beginners/thread261632.html
Доброго времени суток! Помогите с одной задачей.Надо построить таблицу значений(функция y=ln(x/(x-2))). Если в некоторой точке x функция не определена, то вывести на экран сообщение об этом.Я...
C++ Определить истинные следующие утверждения: Определить истинные следующие утверждения: a) «любое выражение в Си может быть преобразован в оператор добавлением к нему точки с запятой (;)» b) «пустой оператор в Си - это отсутствие каких-либо... подробнее

Показать сообщение отдельно
Dexter
286 / 146 / 16
Регистрация: 13.10.2009
Сообщений: 164
22.03.2011, 18:26
Помогу с удалением)
Наверное перемудрил, но делал бы что-то типа такого, чтобы было похоже на предыдущее:
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
list *del(int poz, list *head, int posOrval=1, int all=0)//poz - значение или позиция, head - ну тут понятно, posOrval - если 0, то удаляем по значениям, иначе удаляем по номеру позиции, all - если удалять по значению, то удалять все или только 1ое
{
    list* node=head;
    // Если список пуст
    if(head == NULL){
        return NULL;
    }
    if(posOrval)//Если не 0, то удаляем позицию
    {   
        int i=0;
        while(i<poz&&node->next!=NULL)//идем до нужной позиции
        {
            i++;
            node=node->next;
        }
        if(node->next == NULL&&i!=poz){//если позиция больше чем количество элементов
            return head;//тогда нечего удалять
        }
        else//если нашлось что удалить
        {
            if(node->prev)node->prev->next=node->next;//ссылка предыдущего на следующий
            else //удаляется первый элемент, потому нужно отдать ссылку на второй
            {
                list* temp=node->next;//временно запомним 2ой элемент
                delete node;//так как здесь ссылка на него убивается
                return temp;//отдадим его
            }
            if(node->next)node->next->prev=node->prev;//ссылка следующего на предыдущий
            delete node;//удалили узел
            return head;
        }
    }
    else//если нужно удалить по значению
    {
        int i=0;
        list* res=head;//заведем ссылочку что нужно отдать(на случай удаления 1го элемента)
        do //ну циклик по всем узлам
        {
            if(node->data==poz&&node)//если совпало значение, то удаляем по позиции =)
            {
                node=del(i,res);
                res=node;
                if(!all)break;//если выбрано все удалять, то идем цикле, иначе выходим с него
                i=-1;//-1, чтобы при прокрутке i снова стало 0, то есть мы всегда начинаем искать с начал, можно скопировать код такой-же как при удалении по позиции, но впадло
            }
            else
            node=node->next;//если удалили то первый раз топать никуда ненадо
            i++;
        } while (node);
        return res;//ну и вернем результат
    }
}
Для удаления по позиции, достаточно вызвать
C++
1
List = del(value,List);
А для удаления всех узлов со значением value
C++
1
List = del(value,List,0,1);
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru