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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 13:44   #1
ZavriK
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 12
По умолчанию Односвязный список

Доброго времени суток,возникла некоторая проблема.
Не могу дописать удаление элемента из односвязного списка(если элемент находится в конце или в середине ),если элемент в списке первый-удаление написал.
Не могли бы помочь ?
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <clocale>
struct Node{
	float data;
	Node *next;
};
class List {
public:
	Node * first(float data);
	void add(Node **pend, float data);
	void add_to_begin(Node **pbegin, float data);
	Node * find(Node * const pbeg, float i);
	bool remove(Node **pbeg, Node **pend, float key);
	void print(Node * const pbeg);
};
//Тест программы.
int main() {
	List ab;
	Node *pbeg = ab.first(23456);	
	Node *pend = pbeg;		
	ab.print(pbeg);
	for (float i = 2; i < 6; i++) {
		ab.add(&pend, i);
	}
	ab.print(pbeg);
	
	ab.add_to_begin(&pbeg, 22);
	ab.print(pbeg);
	if (!ab.remove(&pbeg, &pend, 22)) cout << "не найден";
	ab.print(pbeg);
	return 0;
}
// Формирование первого элемента
Node *List::first(float data)
{
	Node *pv = new Node;
	pv->data = data;
	pv->next = 0;
	return pv;
}
// Добавление в конец 
void List::add(Node **pend, float data)
{
	Node *pv = new Node;
	pv->data = data; 
	pv->next = (*pend)->next; 
	(*pend)->next = pv; 
	*pend = pv; 
}
// Добавление в начало
void List::add_to_begin(Node **pbegin, float data)
{
	Node *pv = new Node;
	pv->data = data;
	pv->next = *pbegin;
	(*pbegin) = pv;
}

// Поиск элемента по ключу
Node *List:: find(Node * const pbeg, float data)
{
	Node *pv = pbeg;
	while (pv)
	{
		if (pv->data == data) break;
		pv = pv->next;
	}
	return pv;
}
// Удаление элемента 
bool List:: remove(Node **pbeg, Node **pend, float key)
{
	if (Node *pkey = find(*pbeg, key))
	{
		if (pkey == *pbeg)
		{
			*pbeg = (*pbeg)->next;
			delete pkey;
		}
		else if (pkey ==*pend)
		{
			
			
		}
		else
		{

		}
		return true;
	}
	return false;
}
// Принт.
void List:: print(Node * const pbeg)
{
	Node *pv = pbeg;
	while (pv) { 
		cout << pv->data << ' ';
		pv = pv->next;
	}
	cout << endl;
}
ZavriK вне форума Ответить с цитированием
Старый 01.05.2012, 15:07   #2
ZavriK
Пользователь
 
Регистрация: 04.04.2011
Сообщений: 12
По умолчанию

Функция удаления:
Код:
// Удаление элемента 
bool List:: remove(Node **pbeg, Node **pend, float key)
{
	if (Node *pkey = find(*pbeg, key))
	{
		if (pkey == *pbeg)
		{
			*pbeg = (*pbeg)->next;
			delete pkey;
		}//если элемент первый
		else if (pkey ==*pend)
		{
			
			
		}//если элемент последний
		else
		{

		}//если элемент находится в списке(не первый,не последний)
		return true;
	}
	return false;
}
ZavriK вне форума Ответить с цитированием
Старый 02.05.2012, 22:27   #3
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Код:
#include <iostream>
#include <cstdlib>
using namespace std;

class List{
    struct Node{
        float data;
        Node *next;
        Node( float d, Node *n ){ data = d; next = n; }
    };

    Node *header;
    int size;
public:
    List( void );
    List( const float );
    List( const List & );
    List &operator=( const List & );
    ~List();

    int getSize( void ) const;

    void add ( const float );
    void add_to_begin( const float );
    bool remove( const float );
    void print( void ) const;
};


List::List(){
    header = 0;
    size = 0;
}
List::List( const float d ){
    header = new Node( d, 0 );

    size = 1;
}
List::List( const List &obj ){
    if ( !obj.header ){
        header = 0;
        size = 0;
        return;
    }

    header = new Node(obj.header->data, 0 );
    size = 1;

    for ( Node *curThis = header, *curObj = obj.header->next; curObj; curThis = curThis->next, curObj = curObj->next ){
        curThis->next = new Node(curObj->data, 0);
        ++size;
    }
}
List &List::operator=( const List &obj ){
    if ( this == &obj ) return *this;
    if ( !obj.header ){
        this->~List();
        header = 0;
        size = 0;
        return *this;
    }

    Node *curObj = obj.header;
    Node *curThis;
    if ( header ) curThis->data = curObj->data;
    else { curThis = header = new Node(curObj->data, 0); size = 1; }

    for (; curThis->next && curObj->next; curThis = curThis->next, curObj = curObj->next ){
        curThis->next->data = curObj->next->data;
    }
    if ( curThis->next ){
        Node *t  = curThis->next;
        curThis->next = 0;
        for ( curThis = t; t; t = curThis ){
            curThis = curThis->next;
            delete t;
        --size;
        }
    }else
        for (;curObj->next; curObj = curObj->next, curThis = curThis->next ){
            curThis->next = new Node( curObj->next->data, 0);
            ++size;
        }

    return *this;
}
List::~List(){
    for ( Node *t = header; t; t = header ){
        header = header->next;
        delete t;
    }
}

int List::getSize( void ) const{ return size; }

void List::add( const float d ){
    if ( header ){
        Node *end = header;
        for (; end->next; end = end->next );
        end->next = new Node(d, 0);
        ++size;
    }else{
        header = new Node( d, 0);
        size = 1;
    }
}
void List::add_to_begin( const float d ){
    if ( header ){
        header = new Node(d, header);
        ++size;
    }else{
        header = new Node(d, 0);
        size = 1;
    }
}
bool List::remove( const float d ){
    if ( header ){
        if ( header->data == d ){
            Node *t = header->next;
            delete header;
            --size;
            header = t;
            return true;
        }

        for ( Node *prev = header, *cur = header->next; cur; prev = cur, cur = cur->next ){
            if ( cur->data == d ){
                prev->next = cur->next;
                delete cur;
                --size;
                return true;
            }
        }
    }

    return false;
}
void List::print( void ) const{
    for ( Node *cur = header; cur; cur = cur->next ) std::cout << cur->data << ' ';
}



int main(){
    List ab(23456);
    ab.print();
    cout << endl;

    for ( int i = 2; i < 6; ++i )
        ab.add(i);
    ab.print();
    cout << endl;

    ab.add_to_begin(22);
    if ( !ab.remove(22) )
        cout << "не найден\n";
    ab.print();
    cout << endl;

    system("pause");

    return 0;
}
ERAGORN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо реализовать классы, односвязный список для хранения целых чисел, односвязный список для хранен lineico Помощь студентам 2 09.05.2011 17:45
односвязный список yuliyayuliya Помощь студентам 1 26.04.2011 16:17
Односвязный список pwdan Общие вопросы .NET 3 15.10.2010 14:23
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52