powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление узла из однонаправленого списка
16 сообщений из 16, страница 1 из 1
Удаление узла из однонаправленого списка
    #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
Удаление узла из однонаправленого списка
    #38950871
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из середины-то удалить легко: Node->next = Node->next->next;. Вот для удаления из начала
нужен будет указатель на указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #38951050
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
да проверил -- есть такое представление указателя -- node->next->next -- хотя єто лиш упрощенная форма того что Я написал. Ну а delete node.element -- не надо применять? И какой там указатель надо удаление из начала списка--если список направленный из начала в конец указателями?
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #38951349
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИз середины-то удалить легко: Node->next = Node->next->next;. Вот для удаления из начала
нужен будет указатель на указатель.


А освобождение памяти для удалённого элемента?
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #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
Удаление узла из однонаправленого списка
    #38952098
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

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

не удалит последний элемент из списка.Нет, код Саши правилен.
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #38952272
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть кто-нибудь предложит более изящный/красивый вариант на Си ? Алгоритм, надо полагать, будет аналогичный (при известных head и указателе на удаляемый элемент), однако, мне кажется, что реализация может быть красивее
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #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
Удаление узла из однонаправленого списка
    #38952393
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий, спасибо за пример :)
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #38952422
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

тут все хорошо, кроме читерства с указанием самого списка на входе.
1 он должен быть указан параметром.
2 новый усеченный список должен возвращаться из функции. Или список должен передаваться по ссылке в функцию.
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #38953089
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv1 он должен быть указан параметром.
2 новый усеченный список должен возвращаться из функции. Или список должен передаваться по ссылке в функцию.
Ну, у нас здесь не уроки математики. В жизни сплошь и рядом побочные эффекты случаются ))
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #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
Удаление узла из однонаправленого списка
    #38953173
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, даже если в программе будет несколько стеков, непонятно зачем функция удаления элемента должна возвращать усечённый список. Объясните пожалуйста
...
Рейтинг: 0 / 0
Удаление узла из однонаправленого списка
    #38955117
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryХотя, даже если в программе будет несколько стеков, непонятно зачем функция удаления элемента должна возвращать усечённый список. Объясните пожалуйста


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


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