Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление узла из однонаправленого списка / 16 сообщений из 16, страница 1 из 1
03.05.2015, 21:41
    #38950853
stut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Как правильно удалить узел из однонапрвленого списка: элементами которого есть структура struct Node { Object* element; Node* next; }. Задание очень общее--удалить элемент из середины--чтобы список остался связным в одном направление. Я так понимаю эти узлы надо как то пронумеровать (присвоить имена), в том числе тому который удаляется. Или использовать функцию размера списка: Будет ли правильным такой подход. While (Node(i)->next!=NULL) {if (Node(i)->next==Node(k)) Node(i)->next=Node(k+1)} или использование (int i=0; i<List<Node> l.size(); i++) в начале предыдущего кода?...
...
Рейтинг: 0 / 0
03.05.2015, 22:35
    #38950871
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Из середины-то удалить легко: Node->next = Node->next->next;. Вот для удаления из начала
нужен будет указатель на указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.05.2015, 11:59
    #38951050
stut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Dimitry Sibiryakov,
да проверил -- есть такое представление указателя -- node->next->next -- хотя єто лиш упрощенная форма того что Я написал. Ну а delete node.element -- не надо применять? И какой там указатель надо удаление из начала списка--если список направленный из начала в конец указателями?
...
Рейтинг: 0 / 0
05.05.2015, 01:49
    #38951349
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Dimitry SibiryakovИз середины-то удалить легко: Node->next = Node->next->next;. Вот для удаления из начала
нужен будет указатель на указатель.


А освобождение памяти для удалённого элемента?
...
Рейтинг: 0 / 0
05.05.2015, 02:56
    #38951355
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Вероятно удаление может быть сделано более изящно (надо полагать появятся другие варианты, когда Сообщество проснётся), но вы можете потестировать пока мой. Я его не проверял.

Код: 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.
struct Node
{
	int data;
	struct Node* next;
}* head;


void removeNode(struct Node* el)
{
	struct Node* t;
	if (el == head){
		t = head;
		head = head->next;
		free(t);
	}
	else{
		for (struct Node* prev = head; prev->next; prev = prev->next){
			if (prev->next == el){
				t = prev->next;
				prev->next = prev->next->next;
				free(t);
				break;
			}
		}
	}
}
...
Рейтинг: 0 / 0
05.05.2015, 19:03
    #38952098
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
SashaMercury,

не удалит последний элемент из списка.
...
Рейтинг: 0 / 0
05.05.2015, 22:43
    #38952223
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
MozokSashaMercury,

не удалит последний элемент из списка.Нет, код Саши правилен.
...
Рейтинг: 0 / 0
06.05.2015, 01:46
    #38952272
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Может быть кто-нибудь предложит более изящный/красивый вариант на Си ? Алгоритм, надо полагать, будет аналогичный (при известных head и указателе на удаляемый элемент), однако, мне кажется, что реализация может быть красивее
...
Рейтинг: 0 / 0
06.05.2015, 02:47
    #38952278
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
SashaMercuryМожет быть кто-нибудь предложит более изящный/красивый вариант на Си ? Алгоритм, надо полагать, будет аналогичный (при известных head и указателе на удаляемый элемент), однако, мне кажется, что реализация может быть красивее
Предлагаю не делать различий между головой и другими элементами.
Это красивше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void removeNode(struct Node* el)
{
    for (struct Node** prev_next = &head; *prev_next; prev_next = &(*prev_next)->next) {
        if (*prev_next == el){
            *prev_next = el->next;
            free(el);
            break;
        }
    }
}
...
Рейтинг: 0 / 0
06.05.2015, 10:29
    #38952393
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Анатолий, спасибо за пример :)
...
Рейтинг: 0 / 0
06.05.2015, 10:54
    #38952422
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Anatoly Moskovsky,

тут все хорошо, кроме читерства с указанием самого списка на входе.
1 он должен быть указан параметром.
2 новый усеченный список должен возвращаться из функции. Или список должен передаваться по ссылке в функцию.
...
Рейтинг: 0 / 0
06.05.2015, 22:01
    #38953089
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
MasterZiv1 он должен быть указан параметром.
2 новый усеченный список должен возвращаться из функции. Или список должен передаваться по ссылке в функцию.
Ну, у нас здесь не уроки математики. В жизни сплошь и рядом побочные эффекты случаются ))
...
Рейтинг: 0 / 0
07.05.2015, 03:03
    #38953171
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
MasterZivAnatoly Moskovsky,

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

Эти действия нужны только в том случае, когда во время работы программы используется несколько стеков ? Верно ? В таком случае(код ниже, когда стек единственный), всё должно быть хорошо, как мне кажется. Или не так ?
код в первом приближении
Код: 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.
#include <stdio.h>
#include <stdlib.h>

struct Node
{
	int data;
	struct Node* next;
}*head = NULL;


struct Node* addNode(struct Node* head, int data)
{
	struct Node* n = (struct Node*)malloc(sizeof(struct Node));
	n->data = data;
	n->next = head;
	head = n;
	return n;//return new head
}

void removeNode(struct Node* el)
{
	struct Node* t;
	if (el == head){
		t = head;
		head = head->next;
		free(t);
	}
	else{
		for (struct Node* prev = head; prev->next; prev = prev->next){
			if (prev->next == el){
				t = prev->next;
				prev->next = prev->next->next;
				free(t);
				break;
			}
		}
	}
}

void removeNode2(struct Node* el) //Anatoly Moskovsky 06.05.2015
{
	for (struct Node** cur = &head; *cur; cur = &(*cur)->next) {
		if (*cur == el){
			*cur = el->next;
			free(el);
			break;
		}
	}
}


struct Node* get_pointer(int n)
{
	struct Node* res = head;
	for (int i = 0; i < n; ++i){
		res = res->next;
	}
	return res;
}

void view_Nodes()
{
	printf("\n");
	for (struct Node* cur = head; cur; cur = cur->next)
	{
		printf("%i ", cur->data);
	}
}

int main()
{
	int choice, t;
	do{
		printf("\nprint your choice: ");
		scanf("%i", &choice);
		switch (choice)
		{
		case 1:
			printf("\ndata: ");
			scanf("%i", &t);
			head = addNode(head, t);
			break;
		case 2:
			printf("\nremove el whith n: ");
			scanf("%i", &t);
			removeNode2(get_pointer(t));
			break;
		case 3:
			view_Nodes();
			break;
		case 4:
			break;
		}
	} while (choice != 4);
	return 0;
}

...
Рейтинг: 0 / 0
07.05.2015, 03:11
    #38953173
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
Хотя, даже если в программе будет несколько стеков, непонятно зачем функция удаления элемента должна возвращать усечённый список. Объясните пожалуйста
...
Рейтинг: 0 / 0
09.05.2015, 00:11
    #38955117
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
SashaMercuryХотя, даже если в программе будет несколько стеков, непонятно зачем функция удаления элемента должна возвращать усечённый список. Объясните пожалуйста


ну, думай...
попробуй поудалять из списка из 3,2,1 элементов, погляди, что получится.
...
Рейтинг: 0 / 0
09.05.2015, 07:27
    #38955136
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление узла из однонаправленого списка
и правда, не подумал. Спасибо :)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление узла из однонаправленого списка / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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