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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2012, 16:12   #1
Dr.Teck
 
Регистрация: 13.05.2012
Сообщений: 4
Сообщение Записать очередь в файл

Код:
#include <assert.h>
#include <iostream>
using namespace std;
struct ListNode   //структура, описывающая 1 элемент очереди
{
	char* data;  //данные элемента
	ListNode *nextPtr;  //указатель на следующий элемент
	ListNode *prevPtr;  //указатель на предыдущий элемент
	ListNode(char* value, ListNode *prev) //констуркторк элемента
	{
		data=value;
		nextPtr=NULL;
		prevPtr=prev;
	}
};

class queue  //класс, описывающий очередь
{
public:
	queue();
	~queue();
	void InsertAtFront(char *);
	void InsertAtBack(char *);
	int RemoveFromFront(char *);
	int RemoveFromBack(char *);
	bool isEmpty()const;
	void print()const;
	int length();
	friend ostream &operator<<(ostream &stream, queue *q);
	friend istream &operator>>(istream &stream, queue *q);
	ListNode *FirstPtr;
	ListNode *LastPtr;
	ListNode *GetNewNode(char *, ListNode *);
};

queue::queue()  //конструктор
{ 
	   FirstPtr=LastPtr=NULL; 
}

queue::~queue()  //деструктор
{ 
	if(!isEmpty()) 
	{
		cout<<"Удаление узлов..."<<endl;
		ListNode*CurrentPtr=FirstPtr,*TempPtr;
		while (CurrentPtr!=0)  //пока не конец очереди
		{
			TempPtr=CurrentPtr;
			cout<<TempPtr->data<<endl;  //выводим удаляемый элемент
			CurrentPtr=CurrentPtr->nextPtr; //переходим на следующий
			delete TempPtr;   //удаляем предыдущий
		}
	}
    cout<<"Все узлы удалены!"<<endl; 
}

void queue::InsertAtFront(char *value)  //метод вставки в начало
{
	ListNode *ptr=GetNewNode(value, NULL);  //создаём новый элемент
	if(isEmpty()) FirstPtr=LastPtr=ptr;  //если очередь пуста, то он первый и последний
	else
	{
		ptr->nextPtr=FirstPtr;   //добавляем элемент
		FirstPtr=ptr;
	}
	cout << "Узел добавлен в начало!" << endl;
}

void queue::InsertAtBack(char *value)  //метод вставки в конец
{
	ListNode *ptr=GetNewNode(value, LastPtr); //создаём новый элемент
	if(isEmpty()) FirstPtr=LastPtr=ptr;  //если очередь пуста, то он первый и последний
	else 
	{
		LastPtr->nextPtr=ptr;   //добавляем
		LastPtr=LastPtr->nextPtr;
	}
	cout << "Узел добавлен в конец!" << endl;
}

int queue::RemoveFromFront(char *value)   //удаление из начала очереди
{
	if(isEmpty())   
	{ 
		cout << "Очередь пуста!" << endl; 
		return 0; 
	}
	ListNode *ptr=FirstPtr;
	strcpy(value,ptr->data);
	if(FirstPtr==LastPtr) FirstPtr=LastPtr=NULL;  //если 1 элемент, то очищаем очередь
	else 
	{
		FirstPtr=FirstPtr->nextPtr;   
		FirstPtr->prevPtr=NULL;
	}
	delete ptr;
	cout << "Узел удалён из начала очереди!" << endl;
	return 1;
}
 
int queue::RemoveFromBack(char *value)  //удаление из конца очереди
{
	if(isEmpty()) 
	{ 
		cout << "Очередь пуста!" << endl; 
		return 0; 
	}
	ListNode *ptr=LastPtr;
	strcpy(value,ptr->data);
	if(FirstPtr==LastPtr) FirstPtr=LastPtr=NULL;
	else
	{
		LastPtr=LastPtr->prevPtr;
		LastPtr->nextPtr=NULL;
	}
	delete ptr;
	cout << "Узел удалён из конца очереди!" << endl;
	return 1;
}

bool queue::isEmpty()const   //определение пуста ли очередь
{ 
	return FirstPtr==NULL; 
}

ListNode* queue::GetNewNode(char *value, ListNode *prev)   //метод получения нового элемента    
{ 
	ListNode *ptr = new ListNode(value,prev);
	assert(ptr!=0); 
	return ptr; 
}

void queue::print()const   //метод вывода очереди
{
	if(isEmpty()) 
	{
		cout<<"Очередь пуста!"<<endl;
		return;
	}
    ListNode *CurrentPtr=FirstPtr;
    cout<<"Очередь состоит из:"<<endl;
    while(CurrentPtr!=0)  //пока не конец
	{
		cout<<CurrentPtr->data<<endl;  //выводим элемент
		CurrentPtr=CurrentPtr->nextPtr;  //переходим на следующий
	}
    cout<<endl<<endl; 
}

int queue::length()  //определение длины
{
	int k=0;
	ListNode *tmp=FirstPtr;
	while(tmp)  //пока не конец
	{ 
		tmp=tmp->nextPtr; //переходим на следующий элемент
		k++;  //увеличиваем длину
	}
	return k;  //возвращаем длину
}

ostream &operator<<(ostream &stream, queue *q)
{
	ListNode *tmp=q->FirstPtr;
	while(tmp)
	{
		stream << tmp->data << " ";
		tmp=tmp->nextPtr;
	}
	stream << endl;
	return stream;
}

istream &operator>>(istream &stream, queue *q)
{
	char *data=new char;
	fflush(stdin);
	stream.getline(data,256);
	q->InsertAtBack(data);
	return stream;
}

Последний раз редактировалось Stilet; 13.05.2012 в 17:50.
Dr.Teck вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стек, очередь, список (файл) Gromz Паскаль, Turbo Pascal, PascalABC.NET 0 14.06.2011 16:42
Символьный файл F. Записать в файл G компоненты файла F в обратном порядке,сначала все нечетные, затем чётные. Паскаль. ICE_LADY Помощь студентам 0 08.06.2011 17:32
Записать в Файл sanek_next Помощь студентам 0 19.10.2010 19:54
очередь. создание, вывод в файл Sasha_91 Общие вопросы C/C++ 1 16.03.2009 22:13
Как записать файл в файл программы? Хамяг Общие вопросы Delphi 2 02.11.2008 16:01