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

Ваш аккаунт

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

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

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

Связные списки на С++

8.9K
12 сентября 2010 года
Apach47
130 / / 14.06.2010
Здравствуйте уважаемые формчане.
Задание: Имеем список учеников какого-то класса. Вывести учащихся, чьи фамилии начинаются на букву А и упорядочить их по дате рождения. Все это реализовать на связном списке.

Здесь самая большая проблема в том, что я не могу понять как этот самый связный список выстроить. Читал много в сети о них, саму идею понял, но код, который рядом с ними приводился был написан или в стили СИ(а я в СИ сильно не лез), либо его там вообще не было.

Сам я сейчас встал на месте:
 
Код:
struct Node{
int data;
Node *prev, *next;
}


...и дальше не могу понять что и как; материалы сети привели меня в полное замешательство.
Кому не трудно, приведите пожалуйста самый простой примитивный, но откомментированный код создающий и добавляющий узлы такого списка.
2.1K
12 сентября 2010 года
Norgat
452 / / 12.08.2009
вроде такого?
Код:
#include <iostream>
#include <conio.h>

using namespace std;

struct Node
{
    int data;       // данные
    Node* next;     // следующий элемент
    Node* prev;     // предыдущий элемент
};

// создание нового элемента
Node* newElem(int data)
{
    Node* elem = new Node();    // выделяем память
    elem->next = NULL;          // устанавливаем ссылки
    elem->prev = NULL;
    elem->data = data;
    return elem;
}

// добавление элемента в начало списка
void addElemToList(Node* Head, Node* elem)
{
    if(Head->prev == Head)
    {
        // если список пуст

        Head->prev = elem;  // связать Head с elem
        Head->next = elem;

        elem->next = Head;  // связать elem с Head
        elem->prev = Head;
    }
    else
    {
        // если список не пуст

        // установить в elem ссылки на текущие Head и последний эл. списка
        elem->prev = Head;
        elem->next = Head->next;

        // установить ссылку текущего послд. эл. списка на elem
        Head->next->prev = elem;

        // установить elem послд. элементом списка
        Head->next = elem; 
    }
}

// получить "голову" списка
Node* eraseElem(Node* Head)
{
    if(Head->prev == Head) return NULL; // список пуст, возвращаем NULL
    else
    {
        Node* result = Head->prev;      // получаем голову списка
        Head->prev = result->prev;      // извлекаем ссылку на result из списка
        return result;
    }
}

// создать упр. элемент списка(не хранит значения, нужен для управления)
Node* initList()
{
    Node* Head = new Node();    // выделить память
    Head->next = Head;          // установить ссылки на самого себя
    Head->prev = Head;
    return Head;
}

void main()
{
    // создаём управляющий элемент
    Node* Head = initList();

    // заполняем список числами
    for(int i = 0; i < 10; ++i)
        addElemToList(Head, newElem(i));

    //выводим элементы списка последовательно начиная с головы
    Node* elem = eraseElem(Head);
    while(elem!= NULL)
    {
        cout << "elem = " << elem->data << endl;

        delete elem;    // освобождаем память
        elem = eraseElem(Head); // извлекаем следующий элемент
    }

    _getch();
}


лучше потом сам ещё раз реализуй очередь, стек... с ссылками поможет разобраться.
392
26 сентября 2010 года
cronya
421 / / 03.01.2009
Цитата: Apach47
Здравствуйте уважаемые формчане.
Задание: Имеем список учеников какого-то класса. Вывести учащихся, чьи фамилии начинаются на букву А и упорядочить их по дате рождения. Все это реализовать на связном списке.

Здесь самая большая проблема в том, что я не могу понять как этот самый связный список выстроить. Читал много в сети о них, саму идею понял, но код, который рядом с ними приводился был написан или в стили СИ(а я в СИ сильно не лез), либо его там вообще не было.

Сам я сейчас встал на месте:
 
Код:
struct Node{
int data;
Node *prev, *next;
}


...и дальше не могу понять что и как; материалы сети привели меня в полное замешательство.
Кому не трудно, приведите пожалуйста самый простой примитивный, но откомментированный код создающий и добавляющий узлы такого списка.

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

242
26 сентября 2010 года
Оlga
2.2K / / 04.02.2006
Цитата:
Читал много в сети о них, саму идею понял, но код, который рядом с ними приводился был написан или в стили СИ(а я в СИ сильно не лез), либо его там вообще не было.



тяжело поверить, что в сети нет кода. уж книга Дейтел & Дейтел "как программировать на C++" есть в сети, ну или купи, для студента изучающего си плюс плюс не плохая помощь.

392
29 сентября 2010 года
cronya
421 / / 03.01.2009
Код:
#include<iostream>
#include<ctime>
#include<windows.h>
using namespace std;
//это класс, нечем почти не отличается от структур(struct)
class list
{
    private:
        //данные
        int numer;
        /*
        next-указатель на элемент(в нашем случаи на следующий)
        ptr-указатель на текущий элемент
        head-указатель на голову стека
        */
        list *next, *ptr, *head;
    public:
        //функция для доступа к head
        void get_head(list *buf);
        //заполнение списка
        list *make_list();
        //вывод списка
        void list::out();
};
int main(int argc, char *argv[])
{
    list temp;
    //инициализация пвсевдослучайных чисел;
    srand ((unsigned)time(NULL));
    temp.get_head(temp.make_list());
    temp.out();
    cout<<endl;
    system("pause");
    return 0;
}
void list::get_head(list *buf)
{
    head=buf;
}
list *list::make_list()
{
    next=ptr=head=NULL;
    ptr=new list;
    ptr->numer=rand()%10;
    ptr->next=NULL;
    head=ptr;
    for(int idx=0;idx<9;idx++)
    {
        ptr=new list;
        ptr->numer=rand()%10;
        ptr->next=head;
        head=ptr;
    }
    return head;
}
void list::out()
{
    ptr=head;
    while(ptr!=NULL)
    {
        cout<<ptr->numer<<" ";
        ptr=ptr->next;
    }
    cout<<endl;
}

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