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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
maSt
5 / 5 / 1
Регистрация: 28.02.2010
Сообщений: 166
#1

Односвязный список - C++

07.12.2012, 02:34. Просмотров 1319. Ответов 3
Метки нет (Все метки)

Пришло время понять и разобраться со списками. Кто-то может посоветовать нормальные статьи в интернете?
Сам уже искал, в большинстве статьи которые находил привязаны к особенностям в некоторых примерам, но не дают общей картины.

Добавлено через 22 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Item {
    int liczba;
    struct Item* next;
};
 
void slstore(struct Item *i,
             struct Item **last)
{
  if(!*last) *last = i; 
  else (*last)->next = i;
  i->next = NULL;
  *last = i;
}
Или, вот например, создал структуру в которую буду записывать числа. И дальше нашел функцию которая должна дописывать числа в конец списка. Но мог бы кто-то пошагово объяснить как она работает и как мне передавать в функцию по началу указатель на конец списка, если его еще не существует?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2012, 02:34     Односвязный список
Посмотрите здесь:

Односвязный список - C++
Здравствуйте уважаемые форумчане. Помогите пожалуйста с задачкой: В памяти хранится односвязный список. Вам дан указатель на первый...

Односвязный Список - C++
Как реализовать список в этом коде, необязательно писать код буду благодарен за совет или подсказку! #include "stdafx.h" #include...

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

Односвязный список - C++
Посмотрите программу, правильно ли я вывожу список? Почему список выводится только из 7 цифр, и как можно написать с помощью функций?...

Односвязный список - C++
как в односвязном списке сделать проверку на одинаковые элементы? и если они есть, удалить один из них.

Односвязный список - C++
Дано два списка с целыми числами. Создать новый список в котором размещены элементы какие одновременно присутствуют в первых двух списках. ...

Односвязный список - C++
Помогите пожалуйста написать функцию поиска числа заданного пользователем в односвязном списке

Односвязный список - C++
Доброго времени суток. Помогите, пожалуйста, решить задачу: Реализовать односвязный список, с возможностью его разворота в обратную...

Односвязный список - C++
Начал читать про односвязные списки и никак не пойму, зачем мы выделяем память под первый элемент списка? Мы сначала определяем указатель...

Односвязный список - C++
Есть связной список. У класса есть метод добавления элементов(additem()). Надо исправить метод, чтобы он добавлял элемент не в начало, а в...

Односвязный список - C++
Всем привет. Помогите разобраться с односвязным списком. Вот собственно и вопросы: 1) Если я правильно понял то список это чтото вроде...

Односвязный список - C++
Доброй ночи! Вроде все написала правильно, прога должна читать из файла KR8+.txt и записывать один элемент в KR8.txt в конец списка... но...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RayBor
3 / 3 / 0
Регистрация: 07.12.2012
Сообщений: 28
07.12.2012, 03:41     Односвязный список #2
C
1
2
3
4
5
6
7
8
9
void slstore(struct Item *i, struct Item **last)
{
    if(!*last)         //проверят поинтер который передали, если 0 значит список пуст
        *last = i;    //строит новый (первый) элемент из переданного элемент 
    else
        (*last)->next = i; //если не 0, то добавляет переданный элемент
    i->next = NULL;       //устанавливает поле "следующий" добавленного элемента в 0
    *last = i;               //теперь указатель указывает на последний (добавленный) элемент
}
эта функция добавляет голову, если список пуст и в конец если ей передавать посл. элемент. но для того что бы найти последний нужен проход по списку.
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
07.12.2012, 04:50     Односвязный список #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
88
89
#include <iostream>
#include <cstdint>
#include <iomanip>
 
 
namespace mystd
{
 
    const uint32_t def_size = 1024; //default memory container
 
    template<typename T>
    class shit
    {
    public:
 
        shit() : size(def_size * sizeof(node)), pos(0)
        {
            mem_start_ptr = new node[ size ];
            mem_now_ptr = mem_start_ptr;
        }
 
        ~shit()
        {
            delete [] mem_start_ptr;
        }
 
        int push_back(T __data)
        {
            if (!pos)
            {
                ++pos;
                mem_start_ptr->data = __data;
                mem_start_ptr->next = (node*) NULL;
 
                return 0;
            }
            else if (pos < size - 1)
            {
                ++pos;
                mem_now_ptr->next = mem_now_ptr + 1;
                mem_now_ptr = mem_now_ptr->next;
                mem_now_ptr->data = __data;
                mem_now_ptr->next = (node*) NULL;
 
                return 0;
            }
            else
                return -1;
        }
 
        void dump()
        {
            node *tmp = mem_start_ptr;
 
            while (tmp)
            {
                std::cout << std::setw(3) << tmp->data;
                tmp = tmp->next;
            }
            std::cout << '\n';
        }
 
    private:
        uint32_t size;
        uint32_t pos;
        struct node
        {
            T data;
            node *next;
        };
        node *mem_start_ptr;
        node *mem_now_ptr;
    };
}
 
 
int main()
{
    mystd::shit<int> obj;
 
    for (int i = 0; i < 10; ++i)
        if (obj.push_back ( i ) == -1)
            goto out;
 
    obj.dump ();
out:
 
    return 0;
}
_Alexander
12 / 12 / 1
Регистрация: 05.11.2012
Сообщений: 49
10.12.2012, 09:59     Односвязный список #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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream.h>
#include "List.h"
 
// Элемент данных
struct Element
{
   // Данные
   char data;
   // Адрес следующего элемента списка
   Element * Next;
};
 
// Односвязный список
class List
{
   // Адрес головного элемента списка
   Element * Head;
   // Количество элементов списка
   int Count;
 
public:
   // Конструктор
   List();
   // Деструктор
   ~List();
    
   // Добавление элемента в список
   // (Новый элемент становится головным)
   void Add(char data);
    
   // Удаление элемента списка
   // (Удаляется головной элемент)
   void Del();
   // Удаление всего списка
   void DelAll();
    
   // Распечатка содержимого списка
   // (Распечатка начинается с головного элемента)
   void Print();
    
   // Получение количества элементов, находящихся в списке
   int GetCount();
};
List::List()
{
   // Изначально список пуст
   Head = NULL;
   Count = 0;
}
 
List::~List()
{
   // Вызов функции удаления
   DelAll();
}
 
int List::GetCount()
{
   // Возвращаем количество элементов
   return Count;
}
 
void List::Add(char data)
{
   // создание нового элемента
   Element * temp = new Element;
 
   // заполнение данными
   temp->data = data;
   // следующий элемент - головной элемент списка
   temp->Next = Head;
 
   // новый элемент становится головным элементом списка
   Head = temp;
 
   Count++;
}
 
void List::Del()
{
   // запоминаем адрес головного элемента
   Element * temp = Head;
   // перебрасываем голову на следующий элемент
   Head = Head->Next;
   // удаляем бывший головной элемент
   delete temp;
 
   Count--;
}
 
void List::DelAll()
{
   // Пока еще есть элементы
   while(Head != 0)
      // Удаляем элементы по одному
      Del();
}
 
void List::Print()
{
   // запоминаем адрес головного элемента
   Element * temp = Head;
   // Пока еще есть элементы
   while(temp != 0)
   {
      // Выводим данные
      cout << temp->data; // << " ";
      // Переходим на следующий элемент
      temp = temp->Next;
   }
 
   cout << endl;
}
 
void main()
{
   // Создаем объект класса List
   List lst;
 
   // Тестовая строка
   char s[] = "Hello, World !!!\n";
   // Выводим строку
   cout << s << endl;
   // Определяем длину строки
   int len = strlen(s);
   // Загоняем строку в список
   for(int i = 0; i < len; i++)
      lst.Add(s[i]);
   // Распечатываем содержимое списка
   lst.Print();
   // Удаляем три элемента списка
   lst.Del();
   lst.Del();
   lst.Del();
   // Распечатываем содержимое списка
   lst.Print();
}
вот еще имхо наглядная реализация односвязного списка
Yandex
Объявления
10.12.2012, 09:59     Односвязный список
Ответ Создать тему
Опции темы

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