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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2009, 14:19   #1
Juliet
 
Аватар для Juliet
 
Регистрация: 25.08.2009
Сообщений: 5
Вопрос С++ Однонаправленные списки! Задачка! Помогите....

Пожалуйста помогите девушке решить задачку на С++. Скоро сессия, нужно контрольную сдать, а у самой что-то решение не выходит.

Вот, собстно, что нужно сделать...

Написать программу, в которой создаются динамические структуры, и выполнить их обработку в соответствии со своим вариантом.
Для каждого варианта разработать следующие методы:
1. Конструктор пустого списка.
2. Добавление элемента в список.
3. Удаление элемента из списка.
4. Печать списка.
5. Запись списка в файл.
6. Восстановление списка из файла.
7. Деструктор списка (уничтожение).

Вариант №4: Записи в линейном списке содержат поле данных звена типа int. Сформировать однонаправленный список. Удалить из него элемент с заданным номером, добавить К элементов, начиная с заданного номера;

Заранее спасибо!
Пусть наши желания сойдут с ума от наших возможностей!
Juliet вне форума Ответить с цитированием
Старый 25.08.2009, 14:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а у самой что-то решение не выходит.
А есть какие-то наработки от чего отталкиваться или вообще ноль по фазе?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2009, 14:53   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Предлагаю сделку. Я пишу код. В нем будет несколько ошибок без исправления которых вы этот код не запустите. Исправление ошибок требует не сильно глубокого изучения темы данной программы.

Я думаю так будет честно. Согласны?

ПыСы: предупреждаю, если кто-то из сторонних пользователей прямо укажет на ошибки автору темы, сразу получит штраф, а тема моментально удалится.

Последний раз редактировалось Stilet; 25.08.2009 в 15:25.
MaTBeu вне форума Ответить с цитированием
Старый 25.08.2009, 14:57   #4
Juliet
 
Аватар для Juliet
 
Регистрация: 25.08.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А есть какие-то наработки от чего отталкиваться или вообще ноль по фазе?
К сожалению, вы правы.. Ноль по фазе... Сложно мне с программированием, а сдавать нужно... Была бы очень признательна, если бы вы помогли найти решение вышеуказанной задачки...

MaTBeu, Согласна! =)
Пусть наши желания сойдут с ума от наших возможностей!
Juliet вне форума Ответить с цитированием
Старый 25.08.2009, 15:21   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Хорошо, скоро будет программа. Но хочу заметить, что ошибки бывают очень подлые)))

Чтобы вам было легче, я подскажу темы, по которым будут ошибки.

Итак, вот ваша программа.
Заголовочный файл с объявлением списка
Код:
#ifndef list_h__
#define list_h__

#include <iostream>

struct IntNode   //структура элемента списка
{
	IntNode(int _v = 0, int i): data(_v), number(i)
	{
	}
	int number;  //номер
	int data;     //данные
	IntNode *nextNode; //следующий элемент
}

class IntList
{
public:
	IntList();
	~IntList();
	
	void InsertNode(int); //добавление одного элемента в конец списка
	bool RemoveNode(int); //удаление одного элемента из списка по его порядковому номеру
	void Print(); //вывод
	void Clear(); //очистка

	bool InsertAfterNode(int, int, int *); //вставка нескольких узлов в список начиная с определенной позиции

	void SaveToFile(const char *); //сохранить список в файл
	bool LoadFromFile(const char *); //загрузить список из файла
private:
	IntNode *head_; //первый элемен списка
	IntNode *tail_; //последний элемент списка
	int count_; //количество элементов
}
#endif // list_h__
Собственно файл с реализацией всех методов списка
Код:
#include "list.h"

IntList::IntList() //конструктор
{
	head_ = 0;
	tail_ = 0;
}

IntList::~IntList() //деструктор
{
	Clear();
}

void IntList::InsertNode(int value)
{
	IntNode *newNode = new IntNode(value, count_);
	count_++;
	if(!head_)
		head_ = tail_ = newNode;
	else
	{
		tail_.nextNode = newNode;
		tail_ = newNode;
	}
}

bool IntList::RemoveNode(int index)
{
	IntNode *seeker = head_;
	while(seeker.number != index)
	{
		seeker = seeker.nextNode;
	}
	seeker.nextNode = seeker.nextNode.nextNode;
	count_--;
}

void IntList::Print()
{
	std::cout << "\nContent of list:\n";
	IntNode *current = head_;
	while(current)
	{
		std::cout << current.data << std::endl;
		current = current.nextNode;
	}
}

bool IntList::InsertAfterNode(int index, int count, int *elements)
{
	if(count <= 0 || index < 0)
	{
		throw "Number of elements is less or equal 0!";
		return false;
	}
	else
	{
		IntNode *newList = new IntNode(elements[0], count_);
		count_++;
		IntNode *begin = newList;
		for(int i = 1; i < count; i++)
		{
			newList.nextNode = new IntNode(elements[i], count_);
			count_++;
			newList = newList.nextNode;
		}

		IntNode *place = head_;
		while(place.number != index)
		{
			place = place.nextNode;
		}
		IntNode *temp = place.nextNode;
		place.nextNode = begin;
		newList.nextNode = temp;
	}
	return true;
}

bool IntList::SaveToFile(const char *filename)
{
	ofstream outfile(filename, ios::out);
	if(!outfile.is_open())
	{
		throw "File does not exists!";
		return false;
	}
	else
	{
		IntNode *temp = head_;
		while(temp)
		{
			outfile >> temp.data >> '\n';
			temp = temp.nextNode;
		}
		outfile.close();
	}
	return true;
}

bool IntList::LoadFromFile(const char *filename)
{
	ifstream infile(filename, ios::in);
	if(!infile.is_open())
	{
		throw "File does not exists!";
		return false;
	}
	else
	{
		Clear();
		int value = 0;
		infile >> value;
		InsertNode(value);
	}
	infile.close();
}

void IntList::Clear()
{
	IntList *deleted = head_;
	while(head_)
	{
		deleted = head_;
		head_ = head_.nextNode;
		delete deleted;
	}
	head_ = 0;
}
Возможные ошибки:
1. Декларация класса и структуры.
2. Указатели
3. После добавления определенного количества узлов в список, там нарушается индексация узлов, подумайте, как это можно решить
4. Функция InsertAfterNode не проверяет соответствие количества элементов в массиве количеству добавляемых узлов.
5. Указатель на следующий узел списка

Итак, если исправите/доработаете эти ошибки и сделаете из этого кода рабочую программу - получите от меня + и всеобщее уважение.

Удачи!

Последний раз редактировалось MaTBeu; 25.08.2009 в 18:07.
MaTBeu вне форума Ответить с цитированием
Старый 25.08.2009, 16:21   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от MaTBeu
Возможные ошибки:
1. Декларация класса и структуры.
2. Указатели
3. После добавления определенного количества узлов в список, там нарушается индексация узлов, подумайте, как это можно решить
4. Функция InsertAfterNode не проверяет соответствие количества элементов в массиве количеству добавляемых узлов.
5. Указатель на следующий узел списка
Плюс утечка памяти в одном из методов... не самое важное конечно, но если препод жёсткий, то может придраться))
netrino вне форума Ответить с цитированием
Старый 25.08.2009, 16:24   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Я хотел дописать, что ошибок может быть больше, но потом подумал и решил, что пусть человек немного подумает и сам их найдет =)
MaTBeu вне форума Ответить с цитированием
Старый 25.08.2009, 16:34   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
MaTBeu
Думаю для автора это будет слишком сложно...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2009, 16:38   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

А чего сложного? Все ошибки исправляются после прочтения главы из книги по структурам или классам с самоадресацией. Некоторые ошибки укажет компилятор. Ну а в принципе ошибки 3 и 4 не такие уж и критичные для универской лабы.

Но в конце концов, нужно ж как-то мотивировать человека учится!
Если решит - будет ей + как начинающему программисту, а если не решит, тогда и так ясно.

Просто так кому-то делать, если этот человек не мой друг у меня желания нету. А провести эксперимент - ничего страшного.
MaTBeu вне форума Ответить с цитированием
Старый 25.08.2009, 17:28   #10
Juliet
 
Аватар для Juliet
 
Регистрация: 25.08.2009
Сообщений: 5
По умолчанию

MaTBeu, большое вам спасибо! Постараюсь найти и исправить ошибки, о которых вы говорили.. Самой интересно свои знания проверить... Эксперимент все-таки... Еще раз спасибо! =)

MaTBeu, единственная просьбочка к вам.. Т.к я - абсолютный новичек в вашем деле(уж простите мою неопытность), вы не могли бы доватить комментарии к коду дабы легче его прочесть и разобраться.. Еще раз спасибо!
Пусть наши желания сойдут с ума от наших возможностей!

Последний раз редактировалось Stilet; 26.08.2009 в 08:26.
Juliet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однонаправленные списки в си Марсель059 C++ Builder 18 27.11.2009 13:16
Однонаправленные списки в turbo pascal. Amenus Помощь студентам 5 17.06.2009 13:26
Списки!Задачка AniKa15 Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2009 11:18
Однонаправленные списки, стеки и очереди palich Паскаль, Turbo Pascal, PascalABC.NET 2 16.01.2009 09:28