struct Node{
int data;
Node *prev, *next;
}
Связные списки на С++
Задание: Имеем список учеников какого-то класса. Вывести учащихся, чьи фамилии начинаются на букву А и упорядочить их по дате рождения. Все это реализовать на связном списке.
Здесь самая большая проблема в том, что я не могу понять как этот самый связный список выстроить. Читал много в сети о них, саму идею понял, но код, который рядом с ними приводился был написан или в стили СИ(а я в СИ сильно не лез), либо его там вообще не было.
Сам я сейчас встал на месте:
Код:
...и дальше не могу понять что и как; материалы сети привели меня в полное замешательство.
Кому не трудно, приведите пожалуйста самый простой примитивный, но откомментированный код создающий и добавляющий узлы такого списка.
Код:
#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();
}
#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();
}
лучше потом сам ещё раз реализуй очередь, стек... с ссылками поможет разобраться.
Цитата: Apach47
Здравствуйте уважаемые формчане.
Задание: Имеем список учеников какого-то класса. Вывести учащихся, чьи фамилии начинаются на букву А и упорядочить их по дате рождения. Все это реализовать на связном списке.
Здесь самая большая проблема в том, что я не могу понять как этот самый связный список выстроить. Читал много в сети о них, саму идею понял, но код, который рядом с ними приводился был написан или в стили СИ(а я в СИ сильно не лез), либо его там вообще не было.
Сам я сейчас встал на месте:
...и дальше не могу понять что и как; материалы сети привели меня в полное замешательство.
Кому не трудно, приведите пожалуйста самый простой примитивный, но откомментированный код создающий и добавляющий узлы такого списка.
Задание: Имеем список учеников какого-то класса. Вывести учащихся, чьи фамилии начинаются на букву А и упорядочить их по дате рождения. Все это реализовать на связном списке.
Здесь самая большая проблема в том, что я не могу понять как этот самый связный список выстроить. Читал много в сети о них, саму идею понял, но код, который рядом с ними приводился был написан или в стили СИ(а я в СИ сильно не лез), либо его там вообще не было.
Сам я сейчас встал на месте:
Код:
struct Node{
int data;
Node *prev, *next;
}
int data;
Node *prev, *next;
}
...и дальше не могу понять что и как; материалы сети привели меня в полное замешательство.
Кому не трудно, приведите пожалуйста самый простой примитивный, но откомментированный код создающий и добавляющий узлы такого списка.
Сначала определись какой список, потом откуды его заполняешь. Если не понимаешь как работает, я бы рекомендовал начинать с односвязного списка и рисовать на бумажке. Что такое Смотреть тут
Цитата:
Читал много в сети о них, саму идею понял, но код, который рядом с ними приводился был написан или в стили СИ(а я в СИ сильно не лез), либо его там вообще не было.
тяжело поверить, что в сети нет кода. уж книга Дейтел & Дейтел "как программировать на C++" есть в сети, ну или купи, для студента изучающего си плюс плюс не плохая помощь.
Код:
#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;
}
#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;
}
Вот тебе примерный код на с++ для односвязного списка