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

Удаление/добавление записи по ключу в односвязном списке - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Литература по Visual C++ http://www.cyberforum.ru/cpp-beginners/thread160244.html
Доброго времени суток. 1. Подскажите пожалуйста хорошую книжку по Visual C++ класса - "от А до Я" среда VS. что бы в ней было описание всех формочек, кнопочек до сети и графики и тд. 2....
C++ Цикл for и 56 карт Выводит 14! карт в каждой строке. Я не понял как это получается. // 7_6.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <cstdlib>... http://www.cyberforum.ru/cpp-beginners/thread160209.html
Печать слова копейка в согласованном падеже C++
какая для целого числа печатает слово копейка в согласованном падеже.
Не могу понять в чем ошибка: реализация односвязного списка C++
#include <iostream> using namespace std; struct list { int key; list *next; }; void addList(list *start);
C++ Функция, определяющая достижение начала файла: есть ли такая? http://www.cyberforum.ru/cpp-beginners/thread160173.html
Собственно мне нужна функция, проверяющая достижение начала файла, типа feof только наоборот. Гуглил, ничего не нашел =(
C++ Есть исходники браузера? Есть у кого-нибудь исходники браузера? П.С.Администрации сделайте в каждом разделе форума чат, примерно для таких вопросов. Добавлено через 6 минут П.С. Исходники нужны на чистом Си подробнее

Показать сообщение отдельно
Kant
33 / 33 / 9
Регистрация: 15.05.2013
Сообщений: 236
20.07.2013, 02:53
Сам недавно эту тему разбирал. Вот максимально простой пример для понимания.

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <time.h>
using  std::cout;
using  std::endl;
 
struct Element {
    // Данные
    int data;
    // Адрес следующего элемента списка
    Element * Next;
};
 
// Односвязный список
class List {
    // Адрес первого элемента списка
    Element * Head;
    // Адрес первого элемента списка
    Element * Tail;
 
public:
    // Конструктор
    List() : Head(0), Tail(0) {}
    // Деструктор
    ~List() { /*DelAll(); */    }
 
    void push_back(const int data);
    void removing_duplicate_items();
    void Print() const;
};
 
void List::push_back(const int data)  {
    // создание нового элемента
    Element * temp = new Element;
 
    // заполнение данными
    temp->data = data;
    // следующий элемент отсутствует
    temp->Next = NULL;
    // новый элемент становится последним элементом списка
    // если он не первый добавленный
 
    if(Head != NULL){
        Tail->Next=temp;
        Tail = temp;
    }
    // новый элемент становится единственным
    // если он первый добавленный
    else{
        Head=Tail=temp;
    }
}
 
void List::removing_duplicate_items() {
    //Если нет элементов, то return
    if (NULL == Head) 
        return; 
 
/*Как работает штука, что снизу. 
Есть текущий элемент он находится во внешнем цикле i = Head, который указывает на первый элемент. 
Два указателя pre_j и j бегают от текущего эл. до конца.        
Чтобы удалить эл. из списка необходимо знать эл. перед удаляемым для этого заводим pre_j.
Чтобы удалить эл. необходимо перебросить указатель предыдущего эл. pre_j на следующий после удаляемого
j->next и удалить память по адресу j элемента. */
 
    Element *i, *j, *pre_j, *item_to_remove;
 
    for (i = Head; NULL != i; i = i->Next) {
        for (pre_j = i, j = i->Next; NULL != j;) {
            if (i->data == j->data) {
                cout << i->data << " = " << j->data << endl;
 
                item_to_remove = j;
                pre_j->Next = j = j->Next;
                delete item_to_remove;
 
                Print();
            } 
            else {
                pre_j=pre_j->Next;
                j = j->Next;
            }
        }
    }
}
 
 
void List::Print() const
{
    if(Head != 0) {
        // запоминаем адрес головного элемента
        Element * temp = Head;
        // Пока еще есть элементы
        while(temp != 0)
        {
            // Выводим данные
            cout << temp->data << " ";
            // Переходим на следующий элемент
            temp = temp->Next;
        }
 
        cout << "\n\n";
    }
    else 
        cout << "\nList emty\n";
}
 
 
int main() {
    srand(time(NULL));
 
    List lst;
 
    int val;
    for(int i = 0; i < 15; ++i) {
        val = rand() % 10;
        lst.push_back(val);
    }
 
    lst.Print();
    lst.removing_duplicate_items();
    lst.Print();
    return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru