Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Списки

Автор: Unknown 24.12.2006 23:26

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

Что-то я вообще не представляю с чего начать... Список - это несколько элементов, в каждом из которых есть ссылка на следующий, верно? В моем задании в последнем элементе должна быть ссылка на первый, так? А как определить, что элемент последний? Брать ограниченное количество элементов или как?
Плюс ко всему - в моем задании один элемент списка должен содержать несколько символов, другой - несколько чисел и т.п., да?
А ключ - это просто нумерация или что-то типа того?

Автор: volvo 24.12.2006 23:54

Цитата
В моем задании в последнем элементе должна быть ссылка на первый, так?
Кольцевой список, именно так...
Цитата
А как определить, что элемент последний?
blink.gif Если он указывает на первый, значит он и есть последний... Смотри, что происходит: самое начало работы - у тебя есть только один элемент списка (указывающий сам на себя)... Добавляешь к списку еще один элемент - next первого изменяется (ему присваивается указатель на вновь добавленный элемент), next вновь добавленного - указывает туда, куда за секунду до изменения указывал next первого (фактически, эти действия производятся в обратном порядке) - вот и все, новый элемент был добавлен в конец списка, ибо теперь его next указывает на первый элемент...

Цитата
Плюс ко всему - в моем задании один элемент списка должен содержать несколько символов, другой - несколько чисел и т.п., да?
yes2.gif Используй шаблоны: template <class T> и будет тебе счастье smile.gif

Цитата
А ключ - это просто нумерация или что-то типа того?
Ключ - уникальное значение, однозначно идентифицирующее элемент списка...

Автор: Unknown 25.12.2006 1:31

Ага, спасибо! Теоретически все понял, а вот с практикой - проблемы... sad.gif
Для начала попытался сделать только добавление...

#include <conio.h>
#include <iostream.h>

class list
{
public: char data;
int key;
list *next;
};

list add()
{ //что сдесь должно быть? Хотя бы примерно...
}

void main()
{
clrscr();

list m;
m.data='A';
m.key=1;
m.next=&m;
cout<<"go6aBuTb e/leMeHT B cnucoK? (y/n)\n";

while (getch()=='y') {
add(m);
cout<<"go6aBuTb e/leMeHT B cnucoK? (y/n)\n";
}
getch();
}

Автор: volvo 25.12.2006 2:20

Ну, начать можно вот так:

#include <iostream.h>
#include <assert.h>

typedef int T;

class List {
public:

class Item {

public:
Item(T value, Item *item = 0):
data(value), next(item)
{
}

T data;
Item *next;
};

List() {
list = 0;
}

void print();
void append(T);

private:
Item *list;
Item *get_last();
};


List :: Item *List :: get_last() {
if(!list) return 0;

for(Item *p = list; (p -> next) != list; p = p -> next);
return p;
}

void List :: print() {

if(!list) return;

Item *p = list;
do {

cout << p -> data << endl;
p = p -> next;

} while(p != list);

}

void List :: append(T data) {
Item *pt = new Item(data, list);
assert(pt != 0);

if(!list) {
list = pt; list -> next = list;
return;
}

Item *tail = get_last();
tail -> next = pt;
}

int main() {
List L;

cout << "starting" << endl;
for(int i = 0; i < 10; ++i) L.append(i);
L.print();

return 0;
}


(полностью работоспособный кольцевой список, НЕ содержащий правда данных - только ключи... Кроме этого - я не стал добавлять другие методы, кроме добавления в конец списка)

Тестировалось под TC++ 3.0

Автор: Unknown 25.12.2006 3:22

Таак... Спасибо, конечно.... но я практически ничего из этого не понимаю... sad.gif Нужно будет что-нибудь почитать по этому поводу...
Был бы благодарен за хоть какие-то объяснения unsure.gif

Автор: Гость 24.04.2007 20:20

а у меня такая же прога. Ты бы мог немного добавить объяснений в сложных моментах! И добавь, плиз, данные, а то так не совсем понятно и наглядно!

Автор: volvo 24.04.2007 20:22

Цитата
Ты бы мог немного добавить объяснений в сложных моментах!
Я откуда знаю, ЧТО для тебя "сложные моменты"?

Автор: Focus 1.05.2007 2:18

Volvo, скажи свой номер ICQ, плиз!

Автор: мисс_граффити 1.05.2007 2:29

Focus, я тебя по этому поводу уже предупреждала.
У тебя какой-то настолько личный вопрос, что задать его на форуме ты стесняешься? Пиши в приват, благо, форумом такая возможность предусмотрена.

Автор: Гость 2.05.2007 23:32

ок. Но до него сообщения не доходят. чо делать?

Автор: Focus 2.05.2007 23:35

Volvo, как с тобой связаться?