Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 6

Двусвязный список с целыми числами - Указатель, который ссылается на предыдущий блок

11.11.2014, 17:51. Показов 1512. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте, сразу прошу прощения за тему, которых и так навалом в нете. Я перечитал уйму информации по созданию и не могу понять с указателем, который ссылается на предыдущий блок. Нуждаюсь в помощи. Объясните как для танка, пожалуйста.
Есть код(писал сам, потому, буду рад услышать критику)):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
struct list{
    int data;
    list *pNext;  //указатель на следующую структуру
    list *pPrev; //указатель на предыдущую структуру
};
 
list*pHead=NULL; //указатель на голову стека
list*tail=NULL;     //указатель на его начало
void input(int x){
    list*temp=new list;       //создаю новою область для структуры
    temp->data=x;            //записываю в переменную data значение х
    temp->pNext=pHead;  //указатель pNext указывает на будущую не созданную структуру
    tail=temp;                  //tail присваиваю данную структуру
    temp->pPrev=tail;      //pPrev закрепляю на данной структурой
    pHead=temp;             
    
}
 
void show(){                              //печать структуры начиная с конца
    list *temp=pHead;             //если pHead заменить на tail выводит все равно с конца
    while(temp){
        cout<<temp->data;
        temp=temp->pNext;
    }
}
    
int main(){
    input(1);
    input(2);
    input(3);
    show();
    return 0;
}
Обратите внимание на блок input(). Я хочу, чтобы вывод осуществлялся так же и с начала, но где-то не так написал и не могу понять где и что. С указателем pPrev мне не очень ясно, обобщенно я понимаю, а вот реализовать не могу.
Кому не в тягость, напишите как должно быть правильно и если можно, по простому(без классов) с комментариями. Буду весьма благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2014, 17:51
Ответы с готовыми решениями:

Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке
Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке.

Получить адрес памяти, на который ссылается указатель
Изучаю указатели, появился такой вопрос: int *b = new int(5); Как получить адрес памяти, на который ссылается указатель b? То есть...

Скопировать объект, на который ссылается указатель на абстрактный класс
Доброго времени суток. У меня такое задание: написать программу символьного дифференцирования, т.е. пользователь пишет функцию f(x), а...

11
16 / 16 / 6
Регистрация: 03.11.2014
Сообщений: 72
11.11.2014, 19:27
Вместо структуры я бы сделал класс Node с теми же параметрами а сам список реализовал через класс List
В классе List описать деструктор и конструкторы чтобы потом не париться с выделением памяти и ее освобождении

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Node{
    Node* m_pPrev;
    Node* m_pNext;
    int m_data;
public:
    Node();
    Node(Node* pPrev,int data);
    Node* GetNext() const;
    Node* operator -> ();
    friend std::ostream& operator << (std::ostream&, const Node*);
    friend class List;
};
0
56 / 54 / 33
Регистрация: 05.11.2014
Сообщений: 259
11.11.2014, 19:29
C++
1
2
3
4
5
6
7
void input(int x){
    list*temp = new list;
    temp->data = x;
    temp->pNext = pHead;
    pHead->pPrev = temp;
    temp->pPrev = NULL;
}
Зачем тебе tail понять не могу. Но если нужен указатель на конец стека, то
C++
1
2
temp->pNext = pHead; // после этого
if (!tail) tail = temp;
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 6
11.11.2014, 19:29  [ТС]
С дестуктором и конструктором вопрос не стоит. Я совсем о другом спрашивал)
0
56 / 54 / 33
Регистрация: 05.11.2014
Сообщений: 259
11.11.2014, 19:34
Цитата Сообщение от eho Посмотреть сообщение
C++
1
2
3
4
void show(){ //печать структуры начиная с конца 
list *temp=pHead; //если pHead заменить на tail выводит все равно с конца 
while(temp){ cout<<temp->data; temp=temp->pNext; } 
}
Чтобы использовать tail, нужно идти по списку в обратном направлении через указатель pPrev (вместо pNext).
0
16 / 16 / 6
Регистрация: 03.11.2014
Сообщений: 72
11.11.2014, 19:37
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "Node.h"
Node::Node():m_data(0)
{
    m_pPrev = 0;
    m_pNext = 0;
}
Node::Node(Node* pPrev, int data) : m_data(data)
{
    m_pNext = pPrev->m_pNext;
    m_pPrev = pPrev;
        pPrev->m_pNext->m_pPrev = this;
    pPrev->m_pNext = this;
}
std::ostream& operator << (std::ostream& os, const Node* other)
{
    os << other->m_data;
    return os;
}
Node* Node::GetNext() const
{
    return m_pNext;
}
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 6
11.11.2014, 19:49  [ТС]
Просто, в тех источника, где я читал, использовали tail и head.
C++
1
2
3
4
5
6
7
void input(int x){
    list*temp = new list;
    temp->data = x;
    temp->pNext = pHead;  //pNext указывает на NULL
    pHead->pPrev = temp;  // А здесь pPrev из еще не созданной структуры указывает на предыдущую 
    temp->pPrev = NULL;   //а в предыдущей указывает на нуль
}
тогда после 3-й созданной структуре, в 2-й структуре при помощи temp->pPrev = NULL; пропадет связь с 3-й...я чего-то не догоняю.

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void AddList(int value, int position)
{
DoubleList *node=new DoubleList; //создание нового элемента
node->data=value; //присвоение элементу значения
if (head==NULL) //если список пуст
{
node->next=node; //установка указателя next
node->prev=node; //установка указателя prev
head=node; //определяется голова списка
}
else
{
DoubleList *p=head;
for(int i=position; i>1; i--) p=p->next;
p->prev->next=node;                 //Все ясно до вот этой строчки...как это понять???
node->prev=p->prev;
node->next=p;
p->prev=node;
}
0
16 / 16 / 6
Регистрация: 03.11.2014
Сообщений: 72
11.11.2014, 20:25
C++
1
2
3
4
5
6
7
8
9
10
11
#include "Node.h"
class List{
    Node m_Head;
    Node m_Tail;
    int m_size;
public:
    List();
    void addHead(int);
    void addTail(int);
    friend std::ostream& operator << (std::ostream&, const List&);
};
Добавлено через 24 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "List.h"
List::List():m_Head(),m_Tail()
{
    m_Head->m_pNext = &m_Tail;
    m_Tail->m_pPrev = &m_Head;
    m_size = 0;
}
void List::addHead(int other)
{
    m_Head.m_pNext = new Node(&m_Head, other);
    m_size += 1;
}
void List::addTail(int other)
{
    m_Tail->m_pPrev = new Node(m_Tail->m_pPrev, other);
    m_size += 1;
}
std::ostream& operator << (std::ostream& os, const List& other)
{
    Node* temp = other.m_Head.GetNext();
    while(temp->GetNext())
    {
        os << temp << std::endl;
        temp = temp->GetNext();
    }
    return os;
}
List::~List()
{
    Node* tempDel = m_Head.m_pNext;
    Node* temp = tempDel;
    while(tempDel->m_pNext)
    {
        tempDel = tempDel->m_pNext;
        delete temp;
        temp = tempDel;
    }
}
Добавлено через 8 минут
смысл двухсвязного списка в том что каждый элемент ссылается на следующий и на предыдущий только у головы указатель на предыдущий элемент равен 0 всегда а у хвоста указатель на следующий равен 0 всегда.
Надо это реализовывать
0
56 / 54 / 33
Регистрация: 05.11.2014
Сообщений: 259
11.11.2014, 20:34
Цитата Сообщение от eho Посмотреть сообщение
Просто, в тех источника, где я читал, использовали tail и head.

C++
1
2
3
4
5
6
7
void input(int x){
 list*temp = new list;
 temp->data = x;
 temp->pNext = pHead; //pNext указывает на NULL
 pHead->pPrev = temp; // А здесь pPrev из еще не созданной структуры указывает на предыдущую 
 temp->pPrev = NULL; //а в предыдущей указывает на нуль
}
тогда после 3-й созданной структуре, в 2-й структуре при помощи temp->pPrev = NULL; пропадет связь с 3-й...я чего-то не догоняю.
Ты прав насчет

C++
1
 pHead->pPrev = temp;  // А здесь pPrev из еще не созданной структуры указывает на предыдущую
Нужно заменить на
C++
1
2
 if (pHead) pHead->pPrev = temp;
pHead = temp;
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 6
11.11.2014, 23:23  [ТС]
Смысл я знаю, ребята, вы хоть читали, что я написал в самом первом посте?)

Ты прав насчет

Код C++

C++
1
 pHead->pPrev = temp;
Нужно заменить на
Код C++
C++
1
2
 if (pHead) pHead->pPrev = temp;
pHead = temp;
Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
void input(int x){
 list*temp = new list;
 temp->data = x;
 temp->pNext = pHead; //pNext указывает на NULL
if (pHead) pHead->pPrev = temp;
pHead = temp; //до этого стало ясно, но как быть с указателем на предыдущую структуру? 
 temp->pPrev = NULL;  //эта запись, мне кажется, не верна!
}
0
56 / 54 / 33
Регистрация: 05.11.2014
Сообщений: 259
11.11.2014, 23:56
C++
1
temp->pPrev = NULL;  //эта запись, мне кажется, не верна!
Сдается мне, ты плохо разбираешься в указателях. В данном случае temp и pHead ссылаются на одну и туже структуру в динамической памяти, поэтому эта запись верна до тех пор, пока не вышли за пределы функции input (область видимости temp).
Собственно, это тоже самое:

C++
1
pHead->pPrev = NULL;  // эквивалент temp->pPrev = NULL;
0
16 / 16 / 6
Регистрация: 03.11.2014
Сообщений: 72
12.11.2014, 06:22
А можно выложить весь код с учетом всех изменений?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2014, 06:22
Помогаю со студенческими работами здесь

Создать массив или вектор того типа, на который ссылается указатель
Доброго времени суток. Есть следующая функция template &lt;typename random_access_iterator_tag&gt; void inplmerg...

Двусвязный список. Метод, возвращающий указатель
Делаю класс двусвязного списка TBarNode = record BarData: TBar; Next: ^TBarNode; Prev: ^TBarNode; PSARIndex:...

Как заполнить список случайными целыми числами и вывести из него во второй список нечетные числа
Вообщем нужно создать 2 кнопки: 1)Заполняет список случайными целыми числами. 2)выводит во второй список нечетные числа из первого. ...

Заполнить двусвязный список случайными числами
Здравствуйте, нужно создать и заполнить двусвязный список случайными числами (int). Пытаюсь создать обычный массив,а потом заполнить...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru