Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2012, 18:44   #1
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию Двусвязный Список.

Здравствуйте! Подскажите пожалуйста,что означает строка tail->prev->next = pNode; в добавлении элемента в конец списка,зачем писать tail->prev->next = pNode, почему нельзя просто tail->prev = pNode ?

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
main

Код:
#include "dlist.h"


int main()
{

 List L(8);
 L.add_from_rfont(22);
 L.add_from_rfont(34);
 L.add_from_tail(8);
 L.add_from_tail(78);
 L.add_from_tail(92);
 L.shov_from_foront();

 getch();
 return 0;
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
dlist

Код:
#include "dlist.h"

List::List() // Пустой список.
{
 head = tail = new Node;
 tail->next = 0;
 tail->prev = 0;
}
List::List(int dta)
{

 head = tail = new Node;
 tail->next = 0;
 tail->prev = 0;
 List::add_from_rfont(dta);
}
List::Node::Node(int dta):data(dta)
{
 nodeCount++;
}

void List::add_from_rfont(int dta)
{
 Node *pNode = new Node(dta);
 pNode->next = head;
 pNode->prev = 0;
 head->prev = pNode;
 head = pNode;
}

void List::add_from_tail(int dta)
{
 Node *pNode = new Node(dta);
 pNode->next = tail;
 pNode->prev = tail->prev;
 tail->prev->next = pNode; //////////////////////////////////// !!! Вот эта строка не понятна !!! \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 tail->prev = pNode;
}

void List::shov_from_foront()
{
 Node *pn;
 pn = head;
 while(pn!=tail)
 {
 cout << pn->data << endl;
 pn = pn->next;
 }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
h

Код:
#pragma once

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

using namespace std;

static int nodeCount = 0; // Количество созданных объектов.

class List
{
 class Node
 {
 //friend class List;
 public:
 int data;
 Node *next;
 Node *prev;
 int n; // № элемента.
 Node(int);
 Node(){};
 ~Node();
 };

 Node *head;
 Node *tail;

public:

 void add_from_rfont(int);
 void add_from_tail(int);
 void shov_from_foront(); // Показать от начала.
 void shov_from_tail(); // Показать от хвоста.
 void show_from_nth(int); // Показать от заданного элемента.

 List(int);
 List();
 ~List(){}

};

Последний раз редактировалось ACE Valery; 13.05.2012 в 21:28.
Denis_nn вне форума Ответить с цитированием
Старый 12.05.2012, 20:01   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
tail->prev->next = pNode, почему нельзя просто tail->prev = pNode ?
Потому, что наследники класов.
tail->prev = pNode может иметь, а может и не иметь реализацию "next".
В другом случае, могут не совпадать типы возвращаемых значений.
В третьем, с кодом разбираться не стал (не правильно оформлен) и смеющаяся строка List::Node::Node(int dta)ata(dta), сильно сбивает с мысли.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.05.2012, 20:04   #3
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Потому, что наследники класов.
tail->prev = pNode может иметь, а может и не иметь реализацию "next".
В другом случае, могут не совпадать типы возвращаемых значений.
В третьем, с кодом разбираться не стал (не правильно оформлен) и смеющаяся строка List::Node::Node(int dta)ata(dta), сильно сбивает с мысли.
В общем я так понял,это для устранения неоднозначности делается?
Denis_nn вне форума Ответить с цитированием
Старый 12.05.2012, 21:52   #4
WarHamster
Пользователь
 
Регистрация: 09.08.2010
Сообщений: 48
По умолчанию

Происходит вставка в конец двусвязного списка, то есть между последний значащим элементом и фиктивным элементом tail в конце списка. tail->prev это последний значащий элемент списка. Так как после него должен встать новый элемен pNode, полю next элемента tail->prev присваем pNode. Соответственно tail->prev = pNode это ссылка с фиктивного элемента на новый элемент, вставляемый перед tail
WarHamster вне форума Ответить с цитированием
Старый 12.05.2012, 22:30   #5
Denis_nn
Пользователь
 
Регистрация: 12.05.2012
Сообщений: 22
По умолчанию

Блин!Завтра все переварю,поздно уже!Здесь насамом деле без рисунка не понятно,с ним правдо тоже!)))Спасибо!
Denis_nn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязный список Даsha Помощь студентам 3 26.06.2011 11:45
Двусвязный список decantnik Паскаль, Turbo Pascal, PascalABC.NET 0 09.05.2011 00:58
Двусвязный список Work Group Паскаль, Turbo Pascal, PascalABC.NET 12 13.07.2010 01:44
двусвязный список klykovka Помощь студентам 8 22.05.2010 18:58
двусвязный список на си++ mizantrop32 Общие вопросы C/C++ 0 18.05.2010 17:45