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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2021, 10:05   #1
nonameii3ii
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 73
Восклицание В двухсвязном списке удалить первый и последний элемент

Здраствуйте,вот программка,первый элемент я удалил ,а как удалить последний не могу понять,вот мой код:
Код:
#include <iostream>
#include<string.h>
#include <conio.h>
using namespace std;
struct List{
	int key;	
	List* pred, *next;	
};

List*make_list()
{
	int n;
	cout << "n-?";
	cin >> n;
	List *p, *r, *beg;
	p = new (List);		
	beg = p;	
	cout << "key-?";
	cin >> p->key;		
	p->pred = 0;  p->next = 0;	
	for (int i = 1;i < n;i++)
	{
		r = new(List);	
		cout << "key-?";
		cin >> r->key;	
		p->next = r;	
		r->pred = p;	
		r->next = 0;
		p = r;
		
	}
	return beg;	
}

void print_list(List *beg)
{
	if (beg == 0)		
		cout << "The list is empty\n";
		return;
	}
	List*p = beg;
	while (p)			
	{
		cout << p->key << "\t";
		p = p->next;	
	}
	cout << "\n";
}

List* del_List(List*beg)
{
	List *p = beg;
	beg = beg->next;
		beg->pred = 0;					
		delete p;	
		
}
void main()
{
	List*beg=NULL;
	List*end = NULL;
	int i, k;
	do
	{
		cout << "1.Make list\n";
		cout << "2.Print list\n";
		cout << "3.Del List\n";
		
		cin >> i;
		switch (i)
		{
		case 1:
		{beg = make_list();break;}
		case 2:
		{print_list(beg);break;}
		
		case 3:
		{
			
			beg = del_List(beg);
			break;
		}
		
		
		break;}
		
	} while (i != 4);
}

Последний раз редактировалось BDA; 21.05.2021 в 20:47.
nonameii3ii вне форума Ответить с цитированием
Старый 21.05.2021, 22:37   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Из del_List все-таки стоит возвращать ссылку на новую голову списка. Да и назвать саму функцию так, чтобы стало понятно, что удаляется только первый элемент. А также проверять, что список не пуст. Вместо NULL и 0 использовать nullptr. Поскольку ссылка на конец списка не поддерживается в актуальном состоянии, то удалить последний элемент можно, только пройдя список до конца и найдя его, а потом уже удалять его, аналогично del_List. Если ничего не забыл, то примерно так удалять первый и последний:
Код:
if (beg == nullptr)
    return beg;

List *p = beg;
beg = beg->next;
if (beg != nullptr)
    beg->pred = nullptr;
delete p;

if (beg == nullptr)
    return beg;
p = beg;
while (p->next != nullptr)
    p = p->next;
p->pred->next = nullptr;
delete p;

return beg;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.05.2021 в 22:43.
BDA на форуме Ответить с цитированием
Старый 21.05.2021, 23:06   #3
nonameii3ii
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 73
По умолчанию

BDA, спасибо за помощь,но скажите мы в p заносим адрес 1 элемента,дальше проходим до конца списка,заносим адрес последнего элемента в p,дальше обнуляем адреса прошлого и следующего элемента и удаляем p,правильно?
p = beg;
while (p->next != nullptr)
p = p->next;
p->pred->next = nullptr;
delete p;
nonameii3ii вне форума Ответить с цитированием
Старый 22.05.2021, 00:44   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Начало верно. Правильнее сказать, что после завершения работы цикла "p" содержит адрес последнего элемента. А обнуляем у предыдущего (предпоследнего) элемента ссылку на последний элемент. Кстати, тут закралась ошибка - если список из одного элемента, то предыдущего элемента нет.
Код:
if (beg == nullptr)
    return beg;
p = beg;
while (p->next != nullptr)
    p = p->next;
if (p->pred != nullptr)
    p->pred->next = nullptr;
else
    beg = nullptr;
delete p;

return beg;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.05.2021 в 21:03.
BDA на форуме Ответить с цитированием
Старый 22.05.2021, 11:18   #5
nonameii3ii
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 73
По умолчанию

BDA, Выходит так?
List * del_List (List * beg, List * end)
{
if (beg == nullptr) / * если в списке только один элемент * /
return beg / * Возвращаем начало списка * /
List * p = beg;
beg = beg-> next / * переставить начало списка на следующий элемент * /
if (beg! = nullptr)
beg-> pred = nullptr / * обнулить адрес предыдущего элемента * /
delete p; // удалить первый элемент

if (beg == nullptr) / * если в списке только один элемент * /
return beg;
p = beg; / * Заносим в p адресов первого элемента * /
while (p-> next! = nullptr) / * Если не конец списка * /
p = p-> next; / * Заносим в p адрес последнего элемента * /
if (p-> pred! = nullptr) / * Если в списке не один элемент * /
p-> pred-> next = nullptr / * обнуляем у предыдущего элемента адрес на последний элемент * /
else
beg = nullptr / * Если в списке один элемент обнуляем beg * /
delete p; / * Удаляем последний элемент * /

return beg / * Возвращаем начало списка * /
}
nonameii3ii вне форума Ответить с цитированием
Старый 22.05.2021, 21:20   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
List * del_List (List * beg)
{
    if (beg == nullptr) /* если список пуст */
        return beg; /* возвращаем начало списка */

    List * p = beg;
    beg = beg->next; /* переставить начало списка на следующий элемент */
    if (beg != nullptr)
        beg->pred = nullptr; /* обнулить адрес предыдущего элемента */
    delete p; /* удалить первый элемент */

    if (beg == nullptr) /* если список пуст */
        return beg;
    p = beg; /* заносим в p адрес первого элемента */
    while (p->next != nullptr) /* если есть следующий элемент */
        p = p->next; /* заносим в p адрес следующего элемента */
    if (p->pred != nullptr) /* если в списке не один элемент */
        p->pred->next = nullptr; /* обнуляем у предыдущего элемента адрес на последний элемент */
    else
        beg = nullptr; /* если в списке один элемент, обнуляем адрес начала списка */
    delete p; /* удаляем последний элемент */

    return beg; /* возвращаем начало списка */
}
Для оформления кода используйте кнопочку CODE (и между появившимися тегами вставляйте код). ";" не надо терять - код не скомпилируется. Кое-где пробелы вылезли, с которыми тоже не скомпилируется. Нет смысла передавать адрес конца списка, если в текущем коде его актуальность никак не поддерживается. Но если бы конец был правильно выставлен, то удаление последнего элемента было бы эффективнее (не приходилось бы проходить весь список).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить последний нечетный элемент массива. София43 Помощь студентам 1 04.04.2020 11:02
как удалить последний элемент? Александр121 Python 4 25.08.2018 10:50
В созданном списке вычислить среднее арифметическое и заменить им первый элемент xxxmorgan C++ Builder 0 15.05.2014 22:29
Программа в Паскале: Дан одномерный массив С размерностью N. Переставить местами первый и последний элемент массива, если... hars1 Паскаль, Turbo Pascal, PascalABC.NET 7 19.03.2014 17:30
удалить последний элемент из списка.ООП-Классы Otar4ik Помощь студентам 1 02.02.2014 22:36