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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2015, 00:27   #1
FrostBelarus
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 23
По умолчанию Односвязные\двусвязные списки.С++

Здравствуйте. Нужна помощь в удалении всего списка. Суть задания: есть заготовка проекта(написанная преподавателем),в которой записаны прототипы функций.(просто прототипы,к которым надо "добавить " функции) и несколько готовых функций. Проект надо изменить под свой вариант и доработать, в частности мое задание состоит в реализации функций подсчета элементов списка,удаления всего списка и удаления каждого M-ого элемента. Подсчет затруднений не вызвал,а вот удаление не поддается.В проекте 3 части:1 часть главная(Лабораторная 9...),в ней вызываются функции,описанные во второй части. Вторая часть(list.cpp) содержит собственно функции для работы. И в третьей части(list.h) записано описание структуры списка,конструктор списка и прототипы функций.
Пробовал несколько вариантов,в основном все упиралось в ошибку,которая приведена в скриншоте. Также прикрепляю листинг проекта и методичку, в которой лежит оригинал проекта.


И несколько вопросов в общем:
Дальше идут темы такие: стеки,очереди,бинарные деревья,бинарные кучи,хэш-таблицы. Где об этом можно почитать(книги,сайты), чтобы там была не просто теория,а подробные разборы на практике. Потому что теорию я в целом понимаю,но вот практически несколько "туго" идет. Или для решения этой проблемы надо просто больше писать программ?
Изображения
Тип файла: jpg error.jpg (115.9 Кб, 127 просмотров)
Вложения
Тип файла: doc Документ Microsoft Word.doc (70.0 Кб, 8 просмотров)

Последний раз редактировалось FrostBelarus; 10.05.2015 в 00:37.
FrostBelarus вне форума Ответить с цитированием
Старый 10.05.2015, 00:32   #2
FrostBelarus
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 23
По умолчанию

часть 1(глав.)
Код:
//Клиенты банка. Фамилия И.О., тип счета (срочный, льготный и т.д.), номер счета, сумма на счете, да-та последнего 
//изменения.

#include "stdafx.h"
#include "List.h"
#include <iostream>
using namespace std;
struct Person
{
	char name[20],family[20],otch[20],typesch[20];
	int NumberOf,SummaOf; 
	Person *next;
};
void f(void* b)                       //функция используется при выводе 
{
	Person *a = (Person*)b;
	cout << a->name << "  " << a->family << "  " << a->otch << "  " << a->typesch << "  " << a->NumberOf << "  " << a->SummaOf <<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL, "Russian");
	Person a1 = { "Петров", "Петр", "Петрович", "Кредитный", 12345,100 };
	Person a2 = { "Сидоров", "Иван", "Иванович", "Льготный", 23456,200 };
	Person a3 = { "Гончаров", "Николай", "Алексеевич", "Срочный", 34567,300 };
	Person a4 = { "Обломов", "Сергей", "Владимирович", "Льготный", 13579,400 };
	Person a5 = { "Бунич", "Владислав", "Викторович", "Кредитный", 24680, 400 };
	Person* aa;
	bool rc;
	cout << "---------------------------------------------------" << endl;
	Object List = Create();   // создать список List
	rc = List.Insert(&a1);     // = true
	rc = List.Insert(&a2);     // = true 
	rc = List.Insert(&a3);     // = true 
	rc = List.Insert(&a4);     // = true  
	rc = List.Insert(&a5);
	cout << "Список клиентов банка:" << endl;
	List.PrintList(f);
	cout << "---------------------------------------------------" << endl;
	int i = 0;
	cout << "Количество элементов в списке: " << List.CountList(i) << endl;
	List.DeleteList();
	List.PrintList(f);
	return 0;
}
часть 2 (функции)
Код:
#include "stdafx.h"
#include "List.h"
bool Object::Insert(void* data)           // вставка в начало
{
	bool rc = 0;
	if (Head == NULL)
	{
		Head = new Element(NULL, data, Head); rc = true;
	}
	else
	{
		Head = (Head->Prev = new Element(NULL, data, Head));
		rc = true;
	}
	return rc;
}
Element* Object::Search(void* data)    // найти заданный
{
	Element* rc = Head;
	while ((rc != NULL) && (rc->Data != data))
		rc = rc->Next;
	return rc;
}
void Object::PrintList(void(*f)(void*))     // вывод
{
	Element* e = Head;
	while (e != NULL)
	{
		f(e->Data);	e = e->GetNext();
	};
}
void Object::PrintList(void(*f)(void*), Element *e)
{
	f(e->Data);
}
bool  Object::Delete(Element* e)    // удалить по ссылке
{
	bool rc = 0;
	if (rc = (e != NULL))
	{
		if (e->Next != NULL) e->Next->Prev = e->Prev;
		if (e->Prev != NULL) e->Prev->Next = e->Next;
		else Head = e->Next;
		delete e;
	}
	return rc;
}
bool Object::Delete(void* data)      // удалить по значению
{
	return Delete(Search(data));
};
Element* Object::GetLast()
{
	Element* e = Head, *rc = e;
	while (e != NULL)
	{
		rc = e;
		e = e->GetNext();
	};
	return rc;
}
Object Create() {
	return *(new Object());
}
int Object::CountList(int i)
{
	Element* e = Head;
	while (e)
	{
		i++;
		e = e->GetNext();
	}
   return i;
}
 bool Object::DeleteList()
{
	Element *r = GetFirst();
	while (r)
	{
		if (r->Prev == NULL)
		{
			r->Next->Prev = NULL;
			delete r;
			r = r->Next;
		}
		else 
		{
			r->Prev->Next == NULL;
			delete r;
			r = r->Next;
		}
	}
	return true;
}
часть 3(прототипы)
Код:
#pragma once 
struct Element                                 // элемент списка 
{
	Element* Prev;                             // указатель на предыдущий элемент 
	Element* Next;                             // указатель на следующий элемент 
	void*    Data;                                //  данные  
	Element(Element* prev, void* data, Element* next) // конструктор
	{
		Prev = prev;
		Data = data;
		Next = next;
	}
	Element* GetNext(){ return Next; };          // получить следующий
	Element* GetPrev(){ return Prev; };          // получить предыдущий  
};
struct Object                                             // блок управления списком 
{
	Element* Head;                                        // указатель на начало списка
	Object()  { Head = NULL; };
	Element* GetFirst(){ return Head; };        // получить первый элемент списка 
	Element* GetLast();                                  // получить последний элемент списка
	Element* Search(void* data);                 // найти  первый элемент по данным 
	bool Insert(void* data);                             // добавить элемент в начало
	bool InsertEnd(void* data);			// добавить в конец 
	bool Delete(Element* e);                             // удалить по адресу элемента 
	bool Delete(void* data);                               // удалить первый по данным
	bool DeleteList();				   // очистить список 
	void Object::PrintList(void(*f)(void*));
	void Object::PrintList(void(*f)(void*), Element*);
    int Object::CountList(int i);
	bool  Object::DeleteDouble();
};
Object Create();                           // создать список
FrostBelarus вне форума Ответить с цитированием
Старый 10.05.2015, 07:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нужна помощь в удалении всего списка.
Код:
void Object::Clear()     
{
	Element* e = Head, nxt=0;
	while (e != NULL)
	{
                nxt=e->GetNext();
                delete e;
                e=nxt;		
	};
}
Такое подойдет?
Цитата:
стеки,очереди,бинарные деревья,бинарные кучи,хэш-таблицы. Где об этом можно почитать
Ну либо у нас по примерам полазить, либо на INTUIT.RU заглянуть.
Я бы просто в гугле набрал искомое и читал бы по всем ссылкам.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.05.2015, 15:01   #4
FrostBelarus
Пользователь
 
Регистрация: 10.11.2014
Сообщений: 23
По умолчанию

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

Пожалуйста )
А на Интуит загляни - хороший плейс для прокачки моска.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязные списки RedWhiteCasual Паскаль, Turbo Pascal, PascalABC.NET 0 06.02.2014 09:01
Двусвязные списки Evacuator C++ Builder 0 29.05.2011 13:12
Двусвязные списки aidar9012 Помощь студентам 6 28.06.2010 02:05
двусвязные списки ai\ekcah^p Общие вопросы C/C++ 11 06.06.2009 19:13