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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2010, 01:00   #1
lirikoff
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 24
По умолчанию Как добавить Метод в класс Список с++

Вопрос такой
Я создал класс список(двунаправленный)

Код:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Node
{
	friend class List; //разрешение списку обращаться к своим закрытым частям
public:
	int value;

private:
	Node* p_next;
	Node* p_prev;
};

class List
{
private:
	Node* p_first;
	Node* p_last;

private:
	void copy(const List& list)
	{
		Node* p = NULL;
		while (p = list.get_next(p))
		{
			add(p->value);
		}
	}
public:
	List() : p_first(NULL), p_last(NULL)
	{
		//p_first = NULL;
		//p_last = NULL;
	}
	List(const List& list):  p_first(NULL), p_last(NULL)
	{
		copy(list);
	}

	List& operator= (const List& list)
	{
		if(this != &list)
		{
			clear();
			copy(list);
		}

		return *this;
	}

	~List()
	{
		clear();
	}

	void clear()
	{
		while (p_first)
		{
			Node* p = p_first;
			p_first = p->p_next;
			delete p;
		}
		p_last = NULL;
	}


	void add(int k)
	{
		Node* p = new Node;
		p->p_prev = p_last;
		p->p_next = NULL;
		p->value = k;

		if (p_first == NULL)
		{
			p_last = p;
			p_first = p;
		}
		else
		{
			p_last->p_next = p;
			p_last = p;
		}
	}
	Node* get_next(Node* p) const
	{
		return p != NULL ? p->p_next /*правильное условие*/ : p_first /*неправильное условие*/;
	}
	void print()
	{
		cout << "forward:" << endl;
		for (Node* node = p_first; node != NULL; node = node->p_next)//for (Node* node = p_first; node; node = node->p_next)
		{
			cout << node->value <<" ";
		}
	}


};

void user_print(List& list)
{
	Node* p = NULL;
	while (p = list.get_next(p))
	{
		cout << p->value <<" ";
	}
	cout << endl;
}
/*class Iterator
{
private:
List* list;

public:
int get_next()
{

return 0;
}
};*/
//удалить элемент после заданного



int _tmain(int argc, _TCHAR* argv[])
{
	List L1;
	for( int i=0; i<11; i++)
	{
		L1.add(i+1);
	}
	//L1.print();
	//функция принт:
	user_print(L1);

	List L2 = L1; //то же самое, что List L2(L1)
	user_print(L2);
	L2.add(100);
	user_print(L1);
	user_print(L2);
	
	L1 = L2;
	cout << "L1 = L2" <<endl;
	user_print(L1);
	user_print(L2);

	L2.add(255);
	cout << "L1 = L2 (255)" <<endl;
	user_print(L1);
	user_print(L2);

	cout << "L1 = L1 " <<endl;
	L1 = L1;
	user_print(L1);

	getchar ();
	return 0;
}
Нужно в него добавить Метод, который будет в списке удалять элемент перед заданным.

Не могу понять как тут его реализовать и куда лучше вписать в код.
Подскажите пожалуйста!

Последний раз редактировалось Stilet; 26.08.2010 в 08:03.
lirikoff вне форума Ответить с цитированием
Старый 26.08.2010, 08:43   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Я создал класс список(двунаправленный)
если сам создал, то вопросов типа
Цитата:
куда лучше вписать в код
возникать не должно
rrrFer вне форума Ответить с цитированием
Старый 26.08.2010, 13:06   #3
lirikoff
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 24
По умолчанию

Спасибо за лтвет, очень ценная информация! а если серьезно, то данная тема и существует для подобного рода вопросов, и все таки хотелось бы получить объяснения насчет написания метода.
lirikoff вне форума Ответить с цитированием
Старый 26.08.2010, 13:15   #4
chesser
Пользователь
 
Регистрация: 02.08.2010
Сообщений: 17
По умолчанию

Классу List, конечно же, должен принадлежать метод.
chesser вне форума Ответить с цитированием
Старый 26.08.2010, 13:53   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну если на вскидку то выглядеть он может так:
Код:
	void Del(int i){
		Node *p=p_first;
		for(;(p)&&(i);i--) {
			p=p->p_next;
		};
		if(p){
			if(p->p_prev) p->p_prev->p_next=p->p_next;
			if(p->p_next) p->p_next->p_prev=p->p_prev;
			delete p;
		}
	}
Извини не проверял так как твоя программа у меня не масштабируется, Вообще считаю что она написана слишком сложно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.08.2010, 20:08   #6
lirikoff
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 24
По умолчанию

Stiletпросто этот класс содержит конструктор копирование, конструктор по умолчанию, деструктор, метод перебора элементов списка
в принципе это все весьма абстрактно.
спасибо за помощь, проверю, отпишусь о результатах!
lirikoff вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С# ListBox.Items - добавить список в отдельные строки Blourid Общие вопросы .NET 9 15.07.2010 01:37
Добавить в строковый класс функцию Crudelis Общие вопросы C/C++ 7 10.06.2010 17:52
Класс линейный список valdemar593 Помощь студентам 2 19.04.2010 20:21
Добавить пустые строки в список KNatalia Microsoft Office Excel 5 30.09.2009 08:35