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

Двусвязные списки, не могу добавить узел с конца - 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) «пустой оператор в Си - это отсутствие каких-либо... подробнее

Показать сообщение отдельно
Virusolog
1 / 1 / 0
Регистрация: 22.11.2010
Сообщений: 32

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

22.03.2011, 10:51. Просмотров 1422. Ответов 16
Метки (Все метки)

Делаю лабу по динамическим структурам данным, написал функцию добавления с начала и с конца.
Но, добавление с конца не работает, я не могу найти ошибки или недочета в алгоритме, не могу отследить причину того, что при добавлении узла с конца происходит постоянное перезаписывние вида

ввод: 56
->56
ввод: 4
->4

А должно в итоге быть как ->56->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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
using namespace std;
struct list {
    int data;
    list *next; // Содержит адрес области в памяти на следующий элемент
    list *prev; // Содержит адрес в области памяти на предыдущий элемент
};
// Функции для работы со списком
list *prepend(int val,list *head){
    // Создаем список, оператор new возвращает адрес выделенного фрагмента памяти
    list *pointer = new list; //выделение памяти для новой ячейки
    pointer->data = val; //запись данных в ячейку
    pointer->next = NULL; //инициализация нулем
    pointer->prev = NULL; //инициализация нулем
    // Если список пуст
    if(head == NULL){
      return pointer;
    }
    else {// Если в списке есть хотя бы одна ячейка
      pointer->next = head; //после этой ячейки должна идти бывшая первая
      head->prev = pointer;
      head = pointer; //началом списка делаем только что созданную ячейку
      return head;
    }
};
 
list *append(int val, list *head){
    list *prev,*ptr;
    // Добавить узел в конце списка
    list *pointer = new list;
    pointer->data = val;
    pointer->next = NULL;
    pointer->prev = NULL;
    // Если список пуст
    if(head == NULL){
        return pointer;
    }
    else {
        // Есть начальный адрес списка и только что созданный
        // Нужно найти адрес для последнего узла
        for(prev = head, ptr = head->next; ptr; prev = ptr, ptr = ptr->next);
 
        if(ptr == NULL)
        {
           prev->next = pointer;
           pointer->prev = prev;
           return pointer;
 
        }
    }
};
 
void printlist(list *first){
    list *ptr; //копируем начальный адрес
    for(ptr = first; ptr; ptr = ptr->next){
        cout << "->" << ptr->data;
    }
};
 
void WorkWithList(){
    // Переменная List не содержит адреса на начало списка
    // List должна содержать начальный адрес списка
    list *List = NULL;
    int value,choice;
    for(;;)
    {
    // Вспомагательное меню для работы со списком
    cout << "(1) Dobavlenie uzla v nachalo spiska\n";
    cout << "(2) Dobavlenie uzla v konets spiska\n";
    cout << "(3) Dobavlenie uzla v zadannuy pozitsiu\n";
    cout << "(4) Udalenie tekushchego uzla\n";
    cin >> choice;
    switch(choice)
    {
        case 1:
            cout << "Enter a number ";
            cin >> value;
            // Добавить узел с новым значением в начало списка
            List = prepend(value,List);
            printlist(List);
            break;
        case 2:
            cout << "Enter a number ";
            cin >> value;
            // Добавить узел с новым значением в конец списка
            List = append(value,List);
            printlist(List);
            break;
    }
    }
};
void WorkWithStack(){
};
int main(){
    // Организация меню
    cout << "Enter a number between 1 and 3: ";
    int number;
    cin >> number;
    switch(number)
    {
        case 1: WorkWithList();
        case 2: WorkWithStack();
        // case 3: WorkWithFlow();
    }
    return 0;
}
Помогите, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.