Как я могу создать список на c ++?

Как я могу создать список на C ++? Мне это нужно, чтобы создать связанный список. Как бы я это сделал? Есть ли хорошие уроки или примеры, которым я мог бы следовать?


person jessemiel    schedule 29.12.2008    source источник
comment
он сказал, что изучает его сам, а не для выполнения домашнего задания. я думаю, что тогда неразумно добавлять тег домашнего задания   -  person Johannes Schaub - litb    schedule 29.12.2008
comment
@litb - Согласен. Я просто подправил теги.   -  person Roddy    schedule 29.12.2008
comment
Нам нужен тег, который описывает, когда пользователю нужен код, а это не домашнее задание. Я предлагаю 'plzsendtehcodez'.   -  person George Stocker    schedule 29.12.2008
comment
@Gortok - Не думаю, что это полезно. Это не из тех, что я хочу написать 3D-шутер / создать ботнет / вопрос. Это простой вопрос, но все же разумный, ИМО. plzsendtehcodez - довольно оскорбительный тег, и его следует использовать с большей осмотрительностью ...   -  person Roddy    schedule 29.12.2008
comment
@Roddy: Ты должен был это увидеть, прежде чем я сделал его «разумным».   -  person George Stocker    schedule 29.12.2008
comment
@Gortok - хе-хе - честная точка! Однако возникает другой вопрос: должны ли теги отражать исходный вопрос или текущее изменение ...?   -  person Roddy    schedule 29.12.2008
comment
@Roddy: Отличный вопрос. Я понятия не имею. Мне все еще нравится тег "plzsendtehcodez".   -  person George Stocker    schedule 30.12.2008


Ответы (8)


Я так понимаю, вы знаете, что в C ++ уже есть класс связанного списка, и вы хотите реализовать свой собственный, потому что хотите узнать, как это сделать.

Сначала прочтите Почему мы используем массивы вместо других структур данных?, в котором содержится хороший ответ. базовых структур данных. Затем подумайте, как их смоделировать на C ++:

struct Node {
    int data;
    Node * next;
};

По сути, это все, что вам нужно для реализации списка! (очень простой). Тем не менее, в нем нет абстракций, вы должны связывать элементы в каждой руке:

Node a={1}, b={20, &a}, c={35, &b} d={42, &c};

Теперь у вас есть связанный список узлов, все они размещены в стеке:

d -> c -> b -> a
42   35   20   1

Следующий шаг - написать класс-оболочку List, который указывает на начальный узел и позволяет добавлять узлы по мере необходимости, отслеживая заголовок списка (следующее очень упрощено):

class List {
    struct Node {
        int data;
        Node * next;
    };

    Node * head;

public:
    List() {
        head = NULL;
    }

    ~List() {
        while(head != NULL) {
            Node * n = head->next;
            delete head;
            head = n;
        }
    }

    void add(int value) {
        Node * n = new Node;
        n->data = value;
        n->next = head;
        head = n;
    }

    // ...
};

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

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

person Johannes Schaub - litb    schedule 29.12.2008
comment
В приведенном выше примере, какова будет функция для получения соответствующих данных в соответствующей голове? P.S im noob. - person Vikrant; 13.06.2018

Вам действительно следует использовать стандартный класс List. Если, конечно, это не домашний вопрос или вы не хотите знать, как списки реализуются в STL.

В Google вы найдете множество простых руководств, например этот. Если вы хотите узнать, как работают связанные списки «под капотом», попробуйте поискать примеры / руководства для списков C, а не C ++.

person Roddy    schedule 29.12.2008

Если вы собираетесь использовать std::list, вам необходимо передать параметр типа:

list<int> intList;  
list<int>* intListPtr = new list<int>;

Если вы хотите узнать, как работают списки, я рекомендую поискать в Google несколько руководств по C / C ++, чтобы понять эту тему. Следующим шагом будет изучение C ++, достаточное для создания класса списка и, наконец, класса шаблона списка.

Если у вас есть еще вопросы, задавайте их здесь.

person Razzupaltuff    schedule 29.12.2008

Зачем изобретать велосипед. Просто используйте контейнер списка STL.

#include <list>

// in some function, you now do...
std::list<int> mylist; // integer list

Дополнительная информация ...

person mepcotterell    schedule 29.12.2008
comment
std :: list - это параметризованный тип, и new возвращает указатель, ваш пример должен быть больше похож на: list ‹int› * mylist = new list ‹int›; или еще лучше, просто: list ‹int› mylist; - person Ferruccio; 29.12.2008


Увеличить ptr_list

http://www.boost.org/doc/libs/1_37_0/libs/ptr_container/doc/ptr_list.html

HTH

person plan9assembler    schedule 29.12.2008

Создать список с помощью шаблонов C ++

i.e

template <class T> struct Node 
{
    T data;
    Node * next;
};
    
template <class T> class List 
{
    Node<T> *head,*tail;
        
    public: 
        void push(T const&);  // push element 
        void pop();           // pop element 
        bool empty()          // return true if empty. 
}; 

Затем вы можете написать такой код:

List<MyClass>;

Тип T не является динамическим во время выполнения, а только во время компиляции.

Чтобы просмотреть полный пример, щелкните здесь.

Чтобы просмотреть руководство по шаблонам C ++, щелкните здесь.

person Yasitha Bandara    schedule 07.02.2017

Мы уже в 21 веке !! Не пытайтесь реализовать уже существующие структуры данных. Попробуйте использовать существующие структуры данных.

Использовать библиотеку STL или Boost

person Vinay    schedule 29.12.2008
comment
Imo, всегда хорошая идея создать какую-нибудь - простую - реализацию функций или структур, которые вы пытаетесь понять. ;) - person Razzupaltuff; 29.12.2008
comment
Я согласен с карксом. У нас были подобные задания в школе, и я бы сказал, что я гораздо больше ценю уже написанный код и лучше понимаю, что он на самом деле делает из-за этого. Аналогичным случаем может быть и обучение ассемблеру. Знание абстрактного в целом хорошее. - person Wes P; 29.12.2008
comment
Если это назначение, то его легко реализовать, если оно является частью более крупного проекта, т.е.если оно используется в более крупном проекте для хранения данных, тогда мы не должны реализовывать, мы должны использовать существующую библиотеку. - person Vinay; 30.12.2008