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;
}
#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;
}
Но преподаватель не доволен, да и посмеялся над моей реализацией. Сказал что в конструкторе должна выделяться память под голову. И что уж слишком напутано с добавлением элементов в список. Но с этими требованиями к сожалению у меня не получается толком реализовать метод вставки перед текущим элементом, да и с удалением перед текущим проблемы. Не могли бы вы наставить меня на верный путь.
Код:
AList::AList()
{
head = new List;
current=head;
head->prev=NULL;
head->next=NULL;
};
{
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;
}
if(current->prev == NULL)
{
current=head=head->next;
delete head->prev;
head->prev=NULL;
cout<<"Первый элемент удален"<<endl;
return;
}
temp = current; можно вынести из всех условий при удалении.
Вот класс связного списка, который мне на курсач предоставил преподаватель. На мой взгляд вроде так ничего написано, хотя я глубоко в его реализацию не вникал... Можешь посмотреть, сравнить со своим.
Код:
AList::AList()
{
head = new List;
head->next = head->prev = NULL;
current = NULL;
empty = true;
};
{
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;
}
{
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;
}
Код:
if (current->prev==curren->next)
{
empty=1;
return;
}
{
empty=1;
return;
}
почему не использовать конструкцию else if? все же меньше операций.
Код:
#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";
};
#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";
};
Цитата: Apach47
Вот класс связного списка, который мне на курсач предоставил преподаватель. На мой взгляд вроде так ничего написано, хотя я глубоко в его реализацию не вникал... Можешь посмотреть, сравнить со своим.
А ещё можно исходники STL ковырнуть)
п.с. а начерта выдавать реализацию списка то? Есть же STL'евские контейнеры.