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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2008, 00:26   #1
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию помогите удалить элемент из связанного списка

Саму программу написал, а вот удалить элементы и списка неполучается
вот задание:
Цитата:
Разработайте класс, реализующий линейный односвязный список. Методы класса: вставка элемента после n-го элемента списка, просмотр списка, удаление 3-х элементов списка, начиная с n-го. Поля записей: номер учебной группы, предмет изучения, количество часов, тип проводимых занятий.
Вот моя программа:
Код:
#include "stdafx.h"

using namespace std;
class GroupDataSet
{
public:
	int GroupNumber;
	char Predmet[60];
	char lessonsType[60];
	int hoursNumber;
	GroupDataSet* pNext;
	GroupDataSet* pPrevious;
};

GroupDataSet* pHead=0;

int removeElement(GroupDataSet* pGDS)   // функция удаления
{
	GroupDataSet* pCurrent=pHead;
	if(pGDS == (GroupDataSet*)0)
	{
		return 0;
	}
	while(pCurrent ->pNext)
	{
		//если следующий объект явл-ся искомым 
		if(pGDS == pCurrent->pNext)
		{
			//то заставим текущий объект указывать на следующий за ним
			pCurrent->pNext=pGDS->pNext;
			//удаляем указатель на след эл-т в удаляемом объекте
			pGDS->pNext=(GroupDataSet*)0;
			return 1;
		}
	}
	

	return 0;
}


void addTail(GroupDataSet* pGDS)
{
	pGDS -> pNext =0;
	if(pHead==0)
	{
		pHead=pGDS;
		return;
	}
	GroupDataSet* pCurrent=pHead;
	while(pCurrent -> pNext)
	{
		pCurrent = pCurrent->pNext;
	}
	pCurrent->pNext=pGDS;
}
GroupDataSet* getData()
{
	GroupDataSet* pGDS = new GroupDataSet;
	cout<<"\n Input group number: ";
	cin>> pGDS->GroupNumber;
	if(pGDS->GroupNumber ==0)
	{
		delete pGDS;
		return 0;
	}	
	cout<<"\n Input lesson:";
	cin>>pGDS->Predmet;
	cout<<"\n Input hours number:";
	cin>>pGDS->hoursNumber;
	cout<<"\n Input lesson type:";
	cin>>pGDS->lessonsType;
	pGDS->pNext=0;
//	clrscr();
	system("cls");
	return pGDS;
}
void displayData(GroupDataSet* pGDS)
{
	cout<<" Group number: "<< pGDS->GroupNumber<<endl;
	cout<<" Lesson: "<<pGDS->Predmet<<endl;
	cout<<" Hours number: "<< pGDS->hoursNumber<<endl;
	cout<<" Lesson type: "<< pGDS->lessonsType<<endl;
}

int main()
{
	int key;

	cout<<"\n For quit, input in to the field `Group number` - null"<<endl;
	GroupDataSet* pGDS;
	do
	{
		system("cls");
	cout<<"\n 1-add group;"<<endl;
	cout<<"\n 2-delete group;"<<endl;
	cout<<"\n 3-view all groups;\n"<<endl;
	cout<<"-->";
	key=getch();
	//getch();
	cout<<endl;
	//GroupDataSet* pGDS;
	if(key==49)
	{
	while(pGDS=getData())
	{
		//Добавление эл-та в конец списка объектов
		addTail(pGDS);
	}
	}
	//поочередно выведем все элементы списка
	//(выполнение прекратится, когда указатель
	//на следующий элемент будет равен нулю)
	if(key==50)                                                               //Это часть удаления
	{
		cout<<"\n Delete three next elements!"<<endl;
		int count=0;
		//pGDS=pHead;

		while(count!=2)                                             //нужно удалить 3 эл-та
		{
			removeElement(pGDS);
			pGDS= pGDS->pNext;
			count++;
		}
	}                                                                              //конец

	if(key==51)
	{
	cout<<" Elements:"<<endl;
	cout<<endl;
	pGDS=pHead;
	while(pGDS)
	{
		//отобразим текущий элемент
		displayData(pGDS);
		//получим адрес следующего элемента
		pGDS= pGDS->pNext;
		cout<<"--------------------------------"<<endl;
		getch();
		
	}
	}
//	clrscr();
	
	}while(key!=27);

	system("PAUSE");
	return 0;
}

Поправьте плизз функцию удаления.
kermit вне форума Ответить с цитированием
Старый 13.06.2008, 01:12   #2
Игорь007
Пользователь Подтвердите свой е-майл
 
Аватар для Игорь007
 
Регистрация: 30.05.2008
Сообщений: 96
По умолчанию

Вот вырвал немного у себя. Но только я не совсем понял зачем возвращать ноль или единици, ведь все равно не проверяеться.

И еще у тебя в цикле не происходит прохода по списку, ты так и стаишь на одном месте. Может что и не так (голова уже не соображает).

Код:
int removeElement(GroupDataSet* pGDS)   // функция удаления   
{  
	GroupDataSet* pCurrent=pHead;  
	if(pGDS == 0)  
	{  
		return 0;  
	}   
	while(pCurrent)
	{
		if(pGDS == pCurrent)
		{
			if(!pCurrent->pPrevious && !pCurrent->pNext) //Если в списке только один элемент
			{
				pHead = 0;					//Зануляем указателя на начало списка 
				delete pCurrent;								//Освобождаем память под объект (Удаление)
				return 1;										//Выход
			}
			if(!pCurrent->pPrevious)						//Если удаляемый элемент первый в списке 
			{
				pHead = pCurrent->pNext;				//Начолом списка становиться следующий элемент в списке после удаляемого
				pCurrent->pNext->pPrevious = 0;         //Зануляем указатель на предыдущий элемент
				delete pCurrent;								//Удаляем элемент
				return 1;
			}
			if(!pCurrent->pNext)								//Если удаляемый элемент являеться последним в списке
			{
				pCurrent->pPrevious->pNext = 0;			//Зануляем в предыдущем объекте указатель на следующий элемент
				delete pCurrent;								//Удаляем элемент
				return 1;
			}
			//Если ниадин случай не подошел  
			pCurrent->pPrevious->pNext = pCurrent->pNext; // Перебрасываем указатели 
			delete pCurrent;									// Удаляем
                               return 1;
		}
		pCurrent = pCurrent->pNext;
	}  
	return 0;   
}

Последний раз редактировалось Игорь007; 13.06.2008 в 01:20.
Игорь007 вне форума Ответить с цитированием
Старый 13.06.2008, 01:14   #3
Игорь007
Пользователь Подтвердите свой е-майл
 
Аватар для Игорь007
 
Регистрация: 30.05.2008
Сообщений: 96
По умолчанию

Коментарии немного не влезли
Игорь007 вне форума Ответить с цитированием
Старый 13.06.2008, 03:55   #4
kermit
Пользователь
 
Аватар для kermit
 
Регистрация: 08.06.2008
Сообщений: 14
По умолчанию

Вставил в свой код, при попытке удаления вылетает ошибка дебагер показывает на строчку 124 в первом моем коде, если ее закоментить то ошибки нет, но ничего не удаляет. Не пойму(
kermit вне форума Ответить с цитированием
Старый 13.06.2008, 10:07   #5
Игорь007
Пользователь Подтвердите свой е-майл
 
Аватар для Игорь007
 
Регистрация: 30.05.2008
Сообщений: 96
По умолчанию

Ты закаментил строку 119, ее коментить не ненужно. Поэтому у тебя и вылетала ошибка. Указатель у тебя нулевой, а ты хочеш перейти на следующий. 124 тоже откоменть. Еще нужно проверку на достижение конца списка поставить. При дабовлении элемента в список почему не чего не делаешь с указателем pPrevious. Вобщем вот:

Код:
using namespace std;   
class GroupDataSet   
{  
public:  
	int GroupNumber;  
	char Predmet[60];  
	char lessonsType[60];  
	int hoursNumber;  
	GroupDataSet* pNext;  
	GroupDataSet* pPrevious;  
};   

GroupDataSet* pHead=0;   

int removeElement(GroupDataSet* pGDS)   // функция удаления      
{    
	GroupDataSet* pCurrent=pHead;    
	if(pGDS == 0)    
	{    
		return 0;    
	}      
	while(pCurrent)   
	{  
		if(pGDS == pCurrent)  
		{  
			if(!pCurrent->pPrevious && !pCurrent->pNext) //Если в списке только один элемент  
			{  
				pHead = 0;                  //Зануляем указателя на начало списка   
				delete pCurrent;                                //Освобождаем память под объект (Удаление)  
				return 0;                                       //Выход  
			}   
			if(!pCurrent->pPrevious)                     //Если удаляемый элемент первый в списке    
			{  
				pHead = pCurrent->pNext;             //Начолом списка становиться следующий элемент в списке после удаляемого  
				pCurrent->pNext->pPrevious = 0;         //Зануляем указатель на предыдущий элемент  
				delete pCurrent;                                //Удаляем элемент  
				return 1;  
			}   
			if(!pCurrent->pNext)                             //Если удаляемый элемент являеться последним в списке   
			{  
				pCurrent->pPrevious->pNext = 0;           //Зануляем в предыдущем объекте указатель на следующий элемент  
				delete pCurrent;                                //Удаляем элемент  
				return 0;  
			}   
			//Если ниадин случай не подошел     
			pCurrent->pPrevious->pNext = pCurrent->pNext; // Перебрасываем указатели    
			delete pCurrent;                                    // Удаляем   
			return 1;   
		}   
		pCurrent = pCurrent->pNext;   
	}     
	return 0;      
}   


void addTail(GroupDataSet* pGDS)   
{  
	pGDS -> pNext =0;  
	if(pHead==0)  
	{  
		pHead=pGDS;  
		return;  
	}   
	GroupDataSet* pCurrent=pHead;   
	
	while(pCurrent->pNext)
	{
		pCurrent = pCurrent->pNext;
	}
	pCurrent->pNext = pGDS;
	pGDS->pPrevious = pCurrent;  
}   
GroupDataSet* getData()   
{  
	GroupDataSet* pGDS = new GroupDataSet;  
	cout<<"\n Input group number: ";  
	cin>> pGDS->GroupNumber;  
	if(pGDS->GroupNumber ==0)  
	{  
		delete pGDS;  
		return 0;  
	}      
	cout<<"\n Input lesson:";   
	cin>>pGDS->Predmet;   
	cout<<"\n Input hours number:";   
	cin>>pGDS->hoursNumber;   
	cout<<"\n Input lesson type:";   
	cin>>pGDS->lessonsType;   
	pGDS->pNext=0;
	pGDS->pPrevious=0;
	//  clrscr();   
	system("cls");   
	return pGDS;   
}   
void displayData(GroupDataSet* pGDS)   
{  
	cout<<" Group number: "<< pGDS->GroupNumber<<endl;  
	cout<<" Lesson: "<<pGDS->Predmet<<endl;  
	cout<<" Hours number: "<< pGDS->hoursNumber<<endl;  
	cout<<" Lesson type: "<< pGDS->lessonsType<<endl;  
}   

int main()   
{  
	int key;  

	cout<<"\n For quit, input in to the field `Group number` - null"<<endl;  
	GroupDataSet* pGDS;  
	do  
	{  
		system("cls");  
		cout<<"\n 1-add group;"<<endl;  
		cout<<"\n 2-delete group;"<<endl;  
		cout<<"\n 3-view all groups;\n"<<endl;  
		cout<<"-->";  
		key=getch();  
		//getch();  
		cout<<endl;  
		//GroupDataSet* pGDS;  
		if(key==49)  
		{  
			while(pGDS=getData())  
			{  
				//Добавление эл-та в конец списка объектов  
				addTail(pGDS);  
			}   
		}   
		//поочередно выведем все элементы списка   
		//(выполнение прекратится, когда указатель   
		//на следующий элемент будет равен нулю)   
		if(key==50)                                                               //Это часть удаления   
		{  
			cout<<"\n Delete three next elements!"<<endl;  
			int count=0;  
			pGDS = pHead;  

			while(count!=3)                                             //нужно удалить 3 эл-та  
			{  
				if(!pGDS->pNext)
				{
					removeElement(pGDS);
					break;
				}
				pGDS = pGDS->pNext;
				removeElement(pGDS->pPrevious);
				count++;  
			}   
		}                                                                              //конец   

		if(key==51)   
		{  
			cout<<" Elements:"<<endl;  
			cout<<endl;  
			pGDS=pHead;  
			while(pGDS)  
			{  
				//отобразим текущий элемент  
				displayData(pGDS);  
				//получим адрес следующего элемента  
				pGDS= pGDS->pNext;  
				cout<<"--------------------------------"<<endl;  
				getch();  

			}   
		}   
		//  clrscr();   

	}while(key!=27);   

	system("PAUSE");   
	return 0;   
}
Игорь007 вне форума Ответить с цитированием
Старый 13.06.2008, 10:14   #6
Игорь007
Пользователь Подтвердите свой е-майл
 
Аватар для Игорь007
 
Регистрация: 30.05.2008
Сообщений: 96
По умолчанию

Кстати если ты удаляеш всегда только первых 3 элемента. Тогда строки 47 48 в моем коде ненужны. У тебя немного не правильно алгоритм работы со писками арганизован, поэтому пришлось не много намудрить.
Игорь007 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить. Паскаль. Работа со строками. Удалить лишние пробелы. Комильфо Помощь студентам 3 10.11.2007 21:42
Как сделать, чтобы один элемент списка в ComboBox писался в несколько строк? Andr Общие вопросы Delphi 5 15.08.2007 22:24
Помогите скрыть элемент таблицы в java Romanbl4 Общие вопросы по Java, Java SE, Kotlin 0 24.07.2007 18:14
Помогите, Как программо удалить файл который находится на жестком диске. niva622 Помощь студентам 3 19.04.2007 19:09
как удалить анти вирус( касперский 2006)если она не работает и ее не возможно удалить Alar Общие вопросы Delphi 0 29.10.2006 21:36