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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 18:08   #1
M_Asja
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 14
По умолчанию С++. Двунаправленный список

Задача вот в чём: нужно удалить все элементы, находящиеся после максимального. Подскажите, где в цикле удаления ошибка?


Код:
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <process.h>
#include <stdlib.h>
struct Spis														// Структура двунаправленный список
{
	int		tData;
	Spis	*pPrev;
	Spis	*pNext;
};


 

void main()														// Выполнение приложения
{ 	
	setlocale(LC_CTYPE, "Russian");
	Spis *begin, *end, *t;
	int MaxSize, SpsSize;
	int i,i_p;
	int j=rand()%100;
	printf("\nВведите количество элементов первого списка: ");
	scanf("%i", &MaxSize);	
	printf("\nДинамический список: \n\n");

	
 t = (Spis*) malloc (sizeof(Spis));
	t -> tData=rand()%100; 
	
t -> pPrev = t -> pNext = NULL;
begin = end = t;
for (i = 2; i<=MaxSize; i++)
	{
		t = (Spis*) malloc(sizeof(Spis));  
		t -> tData=rand()%100;
		t -> pNext = NULL;
		t -> pPrev = end;
		end -> pNext = t;
end = t;
}
t = begin;
while(t!=NULL)
{
	printf("%d\n", t->tData);
	t = t -> pNext;}

Spis *key = NULL;
i_p=0;
t = begin;
while(t!=NULL)
	{
		if(t->tData > i_p) {
			i_p=t->tData;
				key = t;}
		else t = t->pNext;}
printf("Максимальный элемент списка равен %d\n",i_p);


printf("Новый список:\n");

while(key->pNext!=end)
	{key=key->pNext;
	(key->pPrev)->pNext=key->pNext;
	(key->pNext)->pPrev=key->pPrev;
	free(key);
}
t = begin;
while(t!=NULL)
{
	printf("%d\n", t->tData);
	t = t -> pNext;}

	_getch();
	
}
M_Asja вне форума Ответить с цитированием
Старый 15.01.2013, 18:25   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Циклить не надо, в этом и прелесть списков
Код:
...
printf("Новый список:\n");

if (key->pPrev==NULL) begin=key->pNext; else
    if (key->pNext==NULL) key->pPrev->pNext=NULL; else
        {key->pPrev->pNext=key->pNext;key->pNext->pPrev=key->pPrev;}
free(key);
/*while(key->pNext!=end)
	{key=key->pNext;
	(key->pPrev)->pNext=key->pNext;
	(key->pNext)->pPrev=key->pPrev;

}*/
t = begin;
while(t!=NULL)
...
Первоначально минимальным элементом лучше делать не ноль, а begin->tData

Последний раз редактировалось eoln; 15.01.2013 в 18:29.
eoln вне форума Ответить с цитированием
Старый 15.01.2013, 18:31   #3
M_Asja
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 14
По умолчанию

если делать вашим способом, то удаляется только максимальный элемент, а надо, чтобы все, которые после него.
M_Asja вне форума Ответить с цитированием
Старый 15.01.2013, 18:44   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Действительно, что-то я не туда посмотрел
Код:
...
printf("Новый список:\n");

key=key->pNext;
if (key!=NULL) key->pPrev->pNext=NULL;
while(key!=NULL)
	{t=key;
	key=key->pNext;
    free(t);
}
t = begin;
...

Последний раз редактировалось eoln; 15.01.2013 в 18:52. Причина: поправка
eoln вне форума Ответить с цитированием
Старый 15.01.2013, 18:47   #5
M_Asja
Пользователь
 
Регистрация: 12.12.2012
Сообщений: 14
По умолчанию

Спасибо вам большое)) Всё получилось))
M_Asja вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двунаправленный список de_coder Паскаль, Turbo Pascal, PascalABC.NET 2 15.10.2012 12:41
двунаправленный список triple56 Общие вопросы C/C++ 0 18.12.2011 19:33
Двунаправленный список grave123 Общие вопросы C/C++ 1 08.03.2010 10:44
Двунаправленный список на С++ JeyKip Помощь студентам 0 11.01.2010 23:04
Двунаправленный список Chudo4258 Помощь студентам 6 09.05.2009 07:16