Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Класс список

17K
18 апреля 2011 года
kilowatt
27 / / 13.01.2007
Здравствуйте. Есть следующая задача:
Запрограммировать класс список.
Дан его интерфейс

Код:
typedef int Data;
class AList
{
  public:
    AList();
    ~AList();
    void first(); // перейти на первый элемент списка
    void next();  // перейти на следующий элемент
    void insert(Data value); // вставка перед текущим
    void remove(); // удалить текущий, текущим становится следущий
    Data get();  // получить данные
    bool eol(); // список кончился, стоим на NULL
    void print(); // распечатать состояние объекта
};

Задачу я сделал:
Код:
#include <iostream>
#include <conio.h>

#define EMPTY 0xFFFFFFFF // возвращаемое значение метода get() при пустом списке

using namespace std;

typedef int Data;

class AList
{
   private:
      typedef struct doublyLinkedList
      {
         Data value;
         struct doublyLinkedList * next;
         struct doublyLinkedList * prev;
      } List;
     
      List *head;
      List *current;
   public:
      AList();
      ~AList();
      void first(); // перейти на первый элемент списка
      void next();  // перейти на следующий элемент
      void insert(Data value); // вставка перед текущим
      void remove(); // удалить текущий, текущим становится следущий
      Data get();  // получить данные
      bool eol(); // список кончился, стоим на NULL
      void print(); // распечатать состояние объекта
};


AList::AList()
{
   head = current = NULL;
};


AList::~AList()
{
   List *temp;
   while(head != NULL)
   {
      temp = head;
      head = head->next;
      delete temp;
   }
   head = current = NULL;
}


void AList::first()
{
   if(head == NULL)
   {
      cout<<"Список пуст"<<endl;
      return;
   }
   current = head;
   cout<<"Перешли на первый элемент"<<endl;
};


void AList::next()
{
   if(head == NULL)
   {
      cout<<"Список пуст"<<endl;
      return;
   }
   
   if(eol())
   {
      cout<<"Стоим на последнем элементе списка"<<endl;
      return;
   }
   current = current->next;
   cout<<"Перешли на следующий элемент"<<endl;
};


bool AList::eol()
{
   return (current->next == NULL);
};


Data AList::get()
{
   if(head == NULL)
   {
      cout<<"Список пуст"<<endl;
      return EMPTY;
   }
   return current->value;
};


void AList::print()
{
   if(head == NULL)
   {
      cout<<"Список пуст"<<endl;
      return;
   }
   else
   {
      List *temp = head;
      while(temp != NULL)
      {
         cout<<temp->value<<" ";
         temp = temp->next;
      }
      cout<<endl;
   }
};


void AList::insert(Data value) // вставка перед текущим, текущим становится добавленный
{
   List *temp = new List;

   //если список пуст
   if(head == NULL)
   {
      temp->value = value;
      temp->prev = NULL;
      temp->next = NULL;
      head = current = temp;
      return;
   }
   
   // если текущий элемент совпадает с головой
   if(current->prev == NULL)
   {
      temp->value = value;
      temp->prev = NULL;
      temp->next = head;
      head->prev = temp;
      head = current = temp;
      return;
   }
 
   //вставка перед текущим элементом
   temp->value = value;
   temp->next = current;
   temp->prev = current->prev;
   current->prev->next = temp;
   current->prev = temp;
   current = temp;
}

void AList::remove() // удалить текущий, текущим становится следущий
{
   
   if(head == NULL)
   {
      cout<<"Список пуст!"<<endl;
      return;
   }
   
   List *temp;
   
   // если список состоит из одного элемента
   if(current->prev == NULL && current->next == NULL)
   {
      temp = current;
      current = head = NULL;
      delete temp;
      cout<<"Последний элемент удален. Список пуст"<<endl;
      return;
   }
   
   // если удаляем первый элемент (текущий - голова)
   if(current->prev == NULL)
   {
      temp = current;
      current = current->next;
      current->prev = NULL;
      head = current;
      delete temp;
      cout<<"Первый элемент удален"<<endl;
      return;
   }
       
   // если удаляем последний элемент (текущий - последний)
   if(current->next == NULL)
   {
      temp = current;
      current = current->prev;
      current->next = NULL;
      delete temp;
      cout<<"Последний элемент удален"<<endl;
      return;
   }
   
   // удаляем элемент
   temp = current;
   current = current->next;
   temp->next->prev = temp->prev;
   temp->prev->next = temp->next;
   delete temp;
   cout<<"Текущий элемент удален"<<endl;
}

int main ()
{
   AList newList;
   newList.insert(1); //1
   newList.insert(2); // 2 1
   newList.insert(3); // 3 2 1
   newList.insert(4); // 4 3 2 1
   newList.insert(5); // 5 4 3 2 1
   newList.insert(6); // 6 5 4 3 2 1
   newList.print(); // 6 5 4 3 2 1 current: 6
   cout<<"Текущий элемент "<<newList.get()<<endl; // current: 6
   newList.next(); // current: 5
   newList.next(); // current: 4
   cout<<"Текущий элемент "<<newList.get()<<endl; // current: 4
   newList.remove();
   newList.print(); // 6 5 3 2 1 current: 5
   newList.first(); // current: 6
   newList.remove();
   newList.insert(7); //7 5 3 2 1 current: 7
   newList.print(); //7 5 3 2 1 current: 7
   cout<<"Текущий элемент "<<newList.get()<<endl;// current: 7
   return 0;
}

Но преподаватель не доволен, да и посмеялся над моей реализацией. Сказал что в конструкторе должна выделяться память под голову. И что уж слишком напутано с добавлением элементов в список. Но с этими требованиями к сожалению у меня не получается толком реализовать метод вставки перед текущим элементом, да и с удалением перед текущим проблемы. Не могли бы вы наставить меня на верный путь.
316
19 апреля 2011 года
Alm3n
889 / / 29.05.2009
в конструкторе должен создаваться пустой список.
 
Код:
AList::AList()
{
   head = new List;
   current=head;
   head->prev=NULL;
   head->next=NULL;
};

можно сделать переменную-флажок. проверять ей пустой список или нет и при добавлении устанавливать ее в 1.
сделай проверку на пустоту отдельным методом.
 
Код:
// если удаляем первый элемент (текущий - голова)
   if(current->prev == NULL)
   {
      current=head=head->next;
      delete head->prev;
      head->prev=NULL;
      cout<<"Первый элемент удален"<<endl;
      return;
   }

temp = current; можно вынести из всех условий при удалении.
8.9K
19 апреля 2011 года
Apach47
130 / / 14.06.2010
Вот класс связного списка, который мне на курсач предоставил преподаватель. На мой взгляд вроде так ничего написано, хотя я глубоко в его реализацию не вникал... Можешь посмотреть, сравнить со своим.
17K
20 апреля 2011 года
kilowatt
27 / / 13.01.2007
Спасибо. Переделал сам. Вот выкладываю.
 
Код:
AList::AList()
{
   head = new List;
   head->next = head->prev = NULL;
   current = NULL;
   empty = true;
};


Так же как и вы решил сделать с помощью флага.

Функции вставки и удаления тоже переделал.

Код:
void AList::insert(Data value)
{
   if(empty)
   {
      head->value = value;
      empty = false;
      current = head;
      return;
   }
   List *temp = new List;
   temp->value = value;
   if(current->prev == NULL)
   {
      temp->prev = NULL;
      temp->next = head;
      head->prev = temp;
      head = current = temp;
      return;  
   }
   temp->next = current;
   temp->prev = current->prev;
   current->prev->next = temp;
   current->prev = temp;
   current = temp;
}

void AList::remove()
{
   if(empty)
      return;
   List *temp;
   temp = current;
   if(current->prev == NULL)
   {
      current = current->next;
      current->prev = NULL;
      head = current;
      delete temp;
      return;
   }
   if(current->next == NULL)
   {
      current = current->prev;
      current->next = NULL;
      delete temp;
      return;
   }
   current = current->next;
   temp->next->prev = temp->prev;
   temp->prev->next = temp->next;
   delete temp;
}
316
20 апреля 2011 года
Alm3n
889 / / 29.05.2009
а где вариант удаления, если один элемент в списке?
 
Код:
if (current->prev==curren->next)
{
   empty=1;
   return;
}

почему не использовать конструкцию else if? все же меньше операций.
17K
03 мая 2011 года
kilowatt
27 / / 13.01.2007
Преподаватель мне все объяснил, оказывается есть такой тип структур данных как список с головой. Замечателен он тем, что очень удобно добавлят элементы, без всевозможных ветвлений. Вот итоговый код класса
Код:
#include <iostream>
#include <conio.h>

using namespace std;

typedef int Data;
class AList
{
   private:
      struct List
      {
         Data value;
         List * next;
      };
     
      List *head;
      List *prev;
   public:
      AList();
      ~AList();
      void first() {prev = head;};
      void next();
      void insert(Data value);
      void remove();
      Data get(){if(prev->next == NULL) {cout<<"List is over"; exit(1);} return prev->next->value;};
      bool eol(){return prev->next == NULL;};
      void print();
};

AList::AList()
{
   head = new List;
   head->next = NULL;
   prev = head;
};

AList::~AList()
{
   List *temp;
   while(head != NULL)
   {
      temp = head;
      head = head->next;
      delete temp;
   }
};  

void AList::next()
{
   if(eol())
   {
      cout<<"Error";
      exit(1);
   }
   prev = prev->next;
};

void AList::insert(Data value)
{
   List *temp = new List;
   temp->value = value;
   temp->next = prev->next;
   prev->next = temp;
   prev = prev->next;
}

void AList::remove()
{
   List *temp;
   if(eol())
   {
      cout<<"Error";
      exit(1);
   }
   temp = prev->next;
   prev->next = temp->next;
   delete temp;
}

void AList::print()
{
   List *temp = head->next;
   while(temp != NULL)
   {
      if(temp == prev->next)
         cout<<"->";
      cout<<temp->value<<" ";
      temp = temp->next;
   }
   
   if(prev->next == NULL)
   {
       cout<<"->NULL";
   }
   cout<<"\n";
};
2.1K
03 мая 2011 года
Norgat
452 / / 12.08.2009
Цитата: Apach47
Вот класс связного списка, который мне на курсач предоставил преподаватель. На мой взгляд вроде так ничего написано, хотя я глубоко в его реализацию не вникал... Можешь посмотреть, сравнить со своим.



А ещё можно исходники STL ковырнуть)

п.с. а начерта выдавать реализацию списка то? Есть же STL'евские контейнеры.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог