Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2014, 20:06   #1
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию Линейный односвязанный список

Всем привет. Объясните мне строчку кода, что она означает?!

Функция удаления элемента из списка

Код:
 void del(list **pbeg)
 {
	 if(*pbeg == 0)
		 cout << "Список пуст";
	 else
	 {
		 list *tmp = *pbeg;
		 int k = 0;
		 do
		 {
			 cout << "\n\nВведите индекс для удаления: ";
			 cin >> k;
		 }
		 while(k <= 1 || k >= 4);
		 for(int i = 1; i < k - 1; i++)
			 tmp = tmp ->link;
		 list *p = tmp ->link;
		 tmp ->link = p ->link;// Что значит?
	 }
 }
помог - жми на весы

Последний раз редактировалось Chainik!; 17.08.2014 в 20:09.
Chainik! вне форума Ответить с цитированием
Старый 17.08.2014, 20:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
tmp ->link = p ->link;// Что значит?
Это значит что tmp будет указывать на следующий элемент после своего соседа.
Лично я считаю код глупым, и не понимаю почему бы не написать проще:
Код:
if(tmp ->link)  tmp ->link = tmp -> link ->link;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.08.2014, 20:38   #3
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию

Так нельзя писать. Потому что элемент будет висеть в памяти, в результате этого мы получим утечку памяти.
помог - жми на весы

Последний раз редактировалось Chainik!; 17.08.2014 в 20:45.
Chainik! вне форума Ответить с цитированием
Старый 17.08.2014, 20:41   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Так нельзя писать. Потому что элемент будет висеть в памяти, в результате этого мы получим утечку памяти.
Память у тебя и так утекает xD.
rrrFer вне форума Ответить с цитированием
Старый 17.08.2014, 20:45   #5
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию

Протестировал этот код, и заметил что он даже удаляет 1 и 4 элемент, то есть крайние элементы.
Возникает вопрос: как он может удалять первый элемент, если он крайний?
То есть перед первым элементом ничего нет, как в цикле мы пробегаем до него??

Код:
void del(list **pbeg)
 {
	 if(*pbeg == 0)
		 cout << "Список пуст";
	 else
	 {
		 list *tmp = *pbeg;
		 int k = 0;
		 do
		 {
			 cout << "\n\nВведите индекс для удаления: ";
			 cin >> k;
		 }
		 while(k < 1 || k > 4);
		 for(int i = 1; i < k - 1; i++)
			 tmp = tmp ->link;
		 if(tmp ->link)
			 tmp ->link = tmp ->link ->link;
	 }
 }
помог - жми на весы

Последний раз редактировалось Stilet; 17.08.2014 в 22:24.
Chainik! вне форума Ответить с цитированием
Старый 17.08.2014, 21:05   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Видимо free или delete надо вызвать для удаляемого элемента (я не знаю что именно).

Как по мне, вы привели просто кусок нежизнеспособного говнокода. Какую задачу вы вообще пытаетесь этим решить?

На 100% уверен, что если вызвать эту функцию для списка из одного элемента программа сломается. так быть не должно.
rrrFer вне форума Ответить с цитированием
Старый 17.08.2014, 21:12   #7
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию

Код:
// Односвязанный список.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "conio.h"

using namespace std;
//--------------------------------------------
struct list
{
	int inf;
	list *link;
};
//--------------------------------------------
void addtobeg(list **pbeg)
{
	list *add = new list;
	cout << "Введите эелемент в начало: ";
	cin >> add ->inf;
	add ->link = NULL;
	if(*pbeg == 0)
		*pbeg = add;
	else
	{
		add ->link = *pbeg;
		*pbeg = add;
	}
	cout << endl;
}
//--------------------------------------------
void addtoend(list **pbeg)
{
	list *add = new list;
	cout << "Введите элемент в конец: ";
	cin >> add ->inf;
	add ->link = NULL;
	if(*pbeg == 0)
		*pbeg = add;
	else
	{
		list *tmp = *pbeg;
		while(tmp ->link)
			tmp = tmp ->link;
		tmp ->link = add;
	}
	cout << endl;
}
//--------------------------------------------
void print(list *pbeg)
{
	if(pbeg == 0)
		cout << "Список пуст!";
	else
	{
		list *tmp = pbeg;
		while(tmp)
		{
			cout << tmp ->inf << " ";
			tmp = tmp ->link;
		}
	}
}
//--------------------------------------------
 void del(list **pbeg)
 {
	 if(*pbeg == 0)
		 cout << "Список пуст";
	 else
	 {
		 list *tmp = *pbeg;
		 int k = 0;
		 do
		 {
			 cout << "\n\nВведите индекс для удаления: ";
			 cin >> k;
		 }
		 while(k <= 1 || k >= 4);
		 for(int i = 1; i < k - 1; i++)
			 tmp = tmp ->link;
		 list *p = tmp ->link;
		 tmp ->link = p ->link;
		 delete p;
	 }
 }
//--------------------------------------------
int main()
{
	setlocale(LC_ALL,"Rus");
	list *p = NULL;
	int n = 0;
	cout << "Размер односвязанного списка: ";
	cin >> n;
	cout << endl;
	for(int i = 1; i <= n; i++)
		addtobeg(&p);
	for(int i = 1; i <= n; i++)
		addtoend(&p);
	cout << "\n\n";
	cout << "Список имеет вид: ";
	print(p);
	del(&p);
	cout << endl << "После удаления имеем: ";
	print(p);
	getch();
	return 0;
}
помог - жми на весы

Последний раз редактировалось Chainik!; 18.08.2014 в 00:43.
Chainik! вне форума Ответить с цитированием
Старый 17.08.2014, 21:17   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Напиши какую задачу ты решаешь.

Есть забавные книжки по чистому коду, я тебе прописываю прочитать книгу Мартина, хотя бы по диагонали.

Одна функция должна решать одну задачу. Функция удаления должна удалять элемент (видимо заданный указателем или индексом). Другая функция должна проверять корректность данных введенных юзером. Нафига сливать все в кучу? - даже без Мартина понятно что так делать нельзя.
rrrFer вне форума Ответить с цитированием
Старый 17.08.2014, 21:23   #9
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию

Создаю односвязанный список

Так как правильно удалить элемент?

Изначальный код предоставленный мною был верный?
помог - жми на весы

Последний раз редактировалось Stilet; 17.08.2014 в 22:27.
Chainik! вне форума Ответить с цитированием
Старый 17.08.2014, 22:28   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Так как правильно удалить элемент?
Могу порекомендовать свою наработку на такой случай:
http://www.programmersforum.ru/showp...8&postcount=25
Там есть пример удаления.
Цитата:
Изначальный код предоставленный мною был верный?
Я его не тестировал, но на глаз я бы не назвал его верным.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
линейный список vlad32651 Паскаль, Turbo Pascal, PascalABC.NET 2 11.12.2013 13:25
Линейный список. GripEnemy Visual C++ 0 05.12.2011 22:35
линейный список Nelson1992 Помощь студентам 1 26.11.2011 01:40
Линейный список doter Общие вопросы C/C++ 1 20.02.2011 21:36
Линейный список Black_Ak24 Паскаль, Turbo Pascal, PascalABC.NET 2 04.01.2008 15:00