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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Быстрая сортировка Хоара http://www.cyberforum.ru/cpp-beginners/thread261701.html
Быстрая сортировка Хоара (QSort) разбивает массив в ходе сортировки до тех пор, пока размер частичного подмассива не станет равен 1 элементу. Есть подозрение, что лучше бы она не доводила разбиение до 1, а передала частичный подмассив какой-нибудь медленной сортировке при достижении размера подмассива M элементов (M<=N). Модифицируйте алгоритм QSort и напишите...
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++ Моделирование алгоритмических вычислений на машинах произвольного доступа
Построить программу для машины произвольного доступа, реализующая вычисления следующих функций, и найти их значения для заданных неотрицательных аргументов. Входные данные заносятся в регистры МДД R1, R2, результат сохраняется в регистре R1. • f(x) = 0; • f(x) = x + 1; • f(x) = x - 1; • f(x, y) = x + y; • f(x, y) = x - y; • f(x, y) = x * y; • f(x, y) = x div y; • f(x, y) = x mod y.
C++ Вычисление значений функции http://www.cyberforum.ru/cpp-beginners/thread261632.html
Доброго времени суток! Помогите с одной задачей.Надо построить таблицу значений(функция y=ln(x/(x-2))). Если в некоторой точке x функция не определена, то вывести на экран сообщение об этом.Я написал кой-что,но она зачения выводит но ошибку нет,помогите с этой напастью)Спасибо заранее)))) #include<math.h> #include<stdio.h> float f( float x ){ return(log(x/(x-2))); } void...
C++ Определить истинные следующие утверждения: Определить истинные следующие утверждения: a) «любое выражение в Си может быть преобразован в оператор добавлением к нему точки с запятой (;)» b) «пустой оператор в Си - это отсутствие каких-либо символов в том месте конструкции, где по синтаксису может находиться оператор» c) «составной оператор (блок) в Си - это совокупность операторов, помещенных в фигурные скобки» d) «оператор... подробнее

Показать сообщение отдельно
Dexter
285 / 145 / 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);
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru