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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2011, 17:54   #1
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию структуры списки классы

Добрый вечер..
Пытаюсь написать программку, использующую классы и циклический список. Только начала изучение..поэтому застряла в самом начале видимо
Прошу подсказать в чем причина ошибки
Вот код программы:
Код:
#include <iostream.h>
#include  <conio.h>
template <class T> class CyclicList
{
private:
	struct cyclic
	{
	  T value;
	  cyclic *next;
	  cyclic *prev;
	};
	cyclic *head,*list;
	int n;
public:
	CyclicList()
	{head=list=NULL; n = 0;};
	~CyclicList(){};
	int add(T value)
	{
	  ++n;
	  cyclic *tmp;
	  tmp->value = value;
	  tmp->prev = NULL;
	  tmp->next =NULL;
	  list = tmp;
	 //if (n==1) head = tmp;
	  return 1;
	};
	void show()
	{
		int val = list->value;
		cout<<val;
	}
};
int main()
{
clrscr();
CyclicList<int> l;
int val;
cout << "vvedite el-t spiska: ";
cin>>val;
l.add(val);
l.show();
getch();
return 0;
}
Ошибка выделена красненьким. Если раскоментить ту сроку, или написать что-то использующее n, например cout. ТО программа сначала выдаст все, что от нее требуют, но потом по окончанию, вылетает ошибка и закрывается приложение
Описание ошибки: Процессор NTVDM обнаружил недопустимую инструкцию
Никому не поставить нас на колени! Мы лежали и будем лежать!

Последний раз редактировалось Rekky; 09.05.2011 в 17:56.
Rekky вне форума Ответить с цитированием
Старый 10.05.2011, 12:00   #2
rustx88
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 42
По умолчанию

держи нямку

main.cpp
Код:
// main.cpp

#include <iostream>
#include "list.h"

using namespace std;

int main(void) {

  list<int> L;

  L.Add(15);
  L.Add(21);

  cout << L.getElem(1) << endl;

  try {
    cout << L.getElem(3) << endl;
  }
  catch (...) {
    cout << "\n\terror - out of size\n";
  }
  //---
  cout << "\n\n\tpress [Enter] for exit...";
  flushall();
  getchar();
  return 0;
};
и реализация списка
list.h
Код:
// list.h 
// двусвязный линейный список

// элемент списка, содержит сами данные, индекс элемента и указатели на предыдущий элемент и следующий
template <typename T> class elem {
public:
  T
    value; // данные
  unsigned
    index; // индекс элемента
  elem<T>
    * prev, // указатель на предыдущий элемент
    * next; // указатель на следующий элемент
};

// список с элементами
template <typename T> class list {
private:
  unsigned
    N; // кол-во элементов списка
  elem<T>
    * head, // первый элемент
    * tail; // последний элемент
public:

  // конструктор
  list() {
    head = tail = NULL;
    N = 0;
  }

  // деструктор
  ~list() {
    elem<T>
      * tmp = NULL;
    // проход по всем элементам списка и их удаление
    while (head) {
      tmp = head->next;
      delete head;
      head = tmp;
    }
    N = 0;
  }

  // получение кол-ва элементов списка
  unsigned getLength() {
    return N;
  }

  // добавление элемента в список
  void Add(const T & data) {
    unsigned
      id = 0; // индекс добавляемого элемента
    elem<T>
      * tmp = new elem<T>;			
    if (N) {
      id = tail->index + 1; // если в списке есть элементы, то индекс добавлямого будет как индекс последнего + 1
      tmp->prev = tail;
      tail->next = tmp;
      tail = tmp;
    }
    else {
      tmp->prev = NULL;
      head = tail = tmp;
    }
    tmp->value = data;
    tmp->index = id;
    tmp->next = NULL;
    N++;
  }

  // получение значения элемента из списка по его индексу
  T getElem(const unsigned id) {
    // если индекс некорректен, генерируем ошибку
    if (id >= N)
      throw new exception("out of size");
    elem<T>
      * tmp = head;
    // поиск элемента
    if (id < N) {
      while (tmp) {
        if (id == tmp->index)
          return tmp->value;
        tmp = tmp->next;
      }
    }
  }

};

всё работает корректно, написал и проверил лично

Последний раз редактировалось rustx88; 10.05.2011 в 12:03.
rustx88 вне форума Ответить с цитированием
Старый 10.05.2011, 17:18   #3
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию

А ты (надеюсь можно так) не в курсе почему. когда я заменяю в list.h
в строке
Код:
tmp->next = NULL;
N++;
NULL на head, прога работает, но опять же по завершению вылетает, но уже без ошибок, просто закрывает приложение...
Мне необходимо реализовать циклический список, чтобы последний элемент ссылался на первый..может быть я что-то упустила?!
Никому не поставить нас на колени! Мы лежали и будем лежать!
Rekky вне форума Ответить с цитированием
Старый 11.05.2011, 01:38   #4
rustx88
Пользователь
 
Регистрация: 08.05.2011
Сообщений: 42
По умолчанию

Цитата:
NULL на head, прога работает, но опять же по завершению вылетает, но уже без ошибок, просто закрывает приложение...
правильно, нужно в деструкторе изменить освобождение памяти, если сделать циклический список - он просто там зацикливается на освобождении

и опять же, смотри за обратной связью элементов, а то у тебя недоделанный циклический получается

что должен делать список при одном элементе - указывать prev и next на самого себя или NULL?
при добавлении элемента и изменении указателя next на head позаботьтесь об изменении указателя head->prev на добавляемый
rustx88 вне форума Ответить с цитированием
Старый 11.05.2011, 18:30   #5
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию

Ок. разобралась, благодарю!
Никому не поставить нас на колени! Мы лежали и будем лежать!
Rekky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
на С++ КЛАССЫ И СПИСКИ Васильева Зинаида Помощь студентам 2 23.11.2010 10:37
Списки и структуры Колючка* Свободное общение 9 28.01.2010 21:45
Динамические структуры данных. Списки. dmit365 Помощь студентам 1 20.12.2009 23:12
Классы и структуры С++ ge4r Помощь студентам 3 18.10.2009 13:11
Динамические структуры данных - списки FoOtBaLiIsT Общие вопросы C/C++ 0 18.03.2009 22:10