powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Базовые структуры данных
13 сообщений из 13, страница 1 из 1
Базовые структуры данных
    #38334822
aybek_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня.
День назад начал изучать С++, и вот сегодня решил написать базовые структуры данных, используя классы.
Буду выкладывать на форум что пишу, очень буду рад критикам и указаниям на ошибки, а так же предложениям
о том как более изящно оформить код.
Нус, начнём...
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38334899
aybek_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализация динамического двусвязного списка, с несколько модифицированным методом поиска.
при выполнении функции find(k), указателю post присваивается адрес элемента с ключом k.
С элементом можно оперировать с помощью функций членов posdel, posget и posset.
Код: plaintext
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.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace std;

struct snode {
	int key;
	snode* next;
	snode* prev;
};

class cdlist {
	private:
		snode* head;	// указатель на начало списка
		snode* tail;	// указатель на конец списка
		snode* post;	// текущее положение

		void add(int k, snode* f, snode* s);
		int del(snode* p);

	public:
		cdlist(int k);
		~cdlist();

		void topadd(int k)	{ add(k, NULL, head); };	// добавление в начало
		void botadd(int k)	{ add(k, tail, NULL); };	// добавление в конец
		void posadd(int k)	{ add(k, post, post->next); };	// добавление между post и post->next

		int topdel()		{ return del(head); };		// удаление первого элемента, если в списке останется 1 элемент, его удаление приведет к ошибке
		int botdel()		{ return del(tail); };		// удаление последнего элемента
		int posdel()		{ return del(post); };		// удаление элемента под курсором

		int fwrd();	// передвигание курсора на следующий элемент, если достигнута граница, возвращает 1
		int bwrd();	// передвигание курсора не предыдущий элемент

		int posget() { return post->key; };	// возвращает значение ключа элемента post
		void posset(int k) { post->key = k; };
		int find(int k);	// присваивает post адресс элемента с ключом k, если такой элемент не найден возвращает 1

		// прочие функции

		void show();
};

int main(int argc, char** argv)
{
	cdlist ob(0);
	int i;
	for (i = 0; i < 10; i++)
		ob.topadd(i);

	ob.find(7);
	ob.posdel();
	ob.show();

	return 0;
}


cdlist::cdlist(int k)
{
	post = head = tail = (snode*) malloc(sizeof (snode));
	assert(head);

	head->next = head->prev = NULL;
	head->key = k;
}

cdlist::~cdlist()
{
	while (!del(head));
	free((void*) tail);
}

// Добавляет елемент между узлами f и s, так же учитываются
// случаи когда f и/или s могут быть равными NULL
void cdlist::add(int k, snode* f, snode* s)
{
	snode* t = (snode*) malloc(sizeof (snode));

	t->key = k;
	t->next = s;
	t->prev = f;

	if (f)
		if (s)
			f->next = s->prev = t;
		else
			f->next = t;
	else
		if (s)
			s->prev = t;

	while (head->prev != NULL)
		head = head->prev;
	while (tail->next != NULL)
		tail = tail->next;
}

int cdlist::del(snode* p)
{
	if (p == head) {
		if (head->next == NULL)
			return 1;
		head = head->next;
		head->prev = NULL;
	}
	else if (p == tail) {
		if (tail->prev == NULL)
			return 1;
		tail = tail->prev;
		tail->next = NULL;
	}
	else {
		p->next->prev = p->prev;
		p->prev->next = p->next;
	}

	free((void*) p);
	return 0;
}

int cdlist::fwrd()
{
	if (post == tail)
		return 1;
	post=post->next;
	return 0;
}

int cdlist::bwrd()
{
	if (post == head)
		return 1;
	post=post->prev;
	return 0;
}

void cdlist::show()
{
	for (snode* curr = head; curr != NULL; curr = curr->next)
		cout <<  curr->key << endl;
}

int cdlist::find(int k)
{
	post = head;
	do {
		if (post->key == k)
			return 0;
	} while(!fwrd());

	return 1;
}
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38334923
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aybek_Реализация динамического двусвязного списка, с несколько модифицированным методом поиска.
при выполнении функции find(k), указателю post присваивается адрес элемента с ключом k.
С элементом можно оперировать с помощью функций членов posdel, posget и posset.
Очень не стоит давать такие имена. Через пару недель сам будешь гадать что это за методы такие.


Код: plaintext
1.
int topdel()		{ return del(head); };		// удаление первого элемента, если в списке останется 1 элемент, его удаление приведет к ошибке

А почему это вдруг? А если я хочу удалить все элементы из списка и получить пустой список?

Убери main() из этого файла. Привыкай к модульной системе: один класс один файл. Исключения из этого правила бывают, но чрезвычайно редко.
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335005
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aybek_,

а должен ли двусвязный список обладать "текущей" позицией?
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335027
aybek_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилaybek_,

а должен ли двусвязный список обладать "текущей" позицией?
Вот и я подумал, среди базовых операций над двусвязным списком присутствует
операция вставки в середину списка, как реализовать это я не знал, ну и в конце
концов пришел в тому, что вот создал указатель (post) и решил перемещать его по списку,
редактируя элементы на которые он указывает.
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335031
aybek_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlОчень не стоит давать такие имена. Через пару недель сам будешь гадать что это за методы такие.
Да, это точно ). А какие имена обычно дают?

White Owl
Код: plaintext
1.
int topdel()		{ return del(head); };		// удаление первого элемента, если в списке останется 1 элемент, его удаление приведет к ошибке

А почему это вдруг? А если я хочу удалить все элементы из списка и получить пустой список?
Гм... Об этом я не подумал...
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335034
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aybek_А какие имена обычно дают?

std::list посмотри
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335444
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aybek_Реализация динамического двусвязного списка, с несколько модифицированным методом поиска.


Обычно такие классы делают шаблонными, и тип хранимого в списке значения является параметром шаблона.
Также странно называть значение, хранящиеся в списке, 'key'. Это не key, это value.
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335448
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aybek_,

snode* post; // текущее положение


Текущее положение в самом списке ненужн'о.
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335458
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилaybek_,

а должен ли двусвязный список обладать "текущей" позицией?

У него не совсем чистый список, а как бы список со встроенным итератором по нему.
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335463
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, получается нереинтерантный список.
Плохо. Может использоваться только в одном потоке.
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335470
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
		void topadd(int k)	{ add(k, NULL, head); };	// добавление в начало
		void botadd(int k)	{ add(k, tail, NULL); };	// добавление в конец
		void posadd(int k)	{ add(k, post, post->next); };	// добавление между post и post->next

		int topdel()		{ return del(head); };		// удаление первого элемента, если в списке останется 1 элемент, его удаление приведет к ошибке
		int botdel()		{ return del(tail); };		// удаление последнего элемента
		int posdel()		{ return del(post); };		// удаление элемента под курсором



Обычно начало и конец списков называют в литературе "голова" (head) и "хвост" (tail), а не верх и низ.
В С++ в стандартной библиотеке они называются front и back.
...
Рейтинг: 0 / 0
Базовые структуры данных
    #38335595
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivУ него не совсем чистый список, а как бы список со встроенным итератором по нему.
это и нехорошо
MasterZivМожет использоваться только в одном потоке.
да и в одном потоке более одного итератора может потребоваться
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Базовые структуры данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]