C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Линейные списки  (Прочитано 2471 раз)
Sergey1985
Участник
**

Сказали спасибо: +8/-1
Offline Offline

Сообщений: 310


« : 14 июля 2018, 19:13:44 »

Всем доброго времени суток. Имеется кодик
Код
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct Node
{
int d;
Node *next;
Node *prev;
};
//---------------------------------------------------------------------------
Node *first(int d);
void add(Node **pend, int d);
Node *find(Node *const pbeg, int i);
bool remove(Node **pbeg, Node **pend, int key);
Node *insert(Node *const pbeg, int key, int d);
 
Node *pbeg;
Node *pend;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// &#212;&#238;&#240;&#236;&#232;&#240;&#238;&#226;&#224;&#237;&#232;&#229; &#239;&#229;&#240;&#226;&#238;&#227;&#238; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224;
Node *first(int d)
{
Node *pv = new Node;
pv->d = d;
pv->next = 0;
pv->prev = 0;
return pv;
}
 
// &#196;&#238;&#225;&#224;&#226;&#235;&#229;&#237;&#232;&#229; &#226; &#234;&#238;&#237;&#229;&#246; &#241;&#239;&#232;&#241;&#234;&#224;
void add(Node **pend, int d)
{
Node *pv = new Node;
pv->d = d;
pv->next = 0;
pv->prev = *pend;
(*pend)->next = pv;
*pend = pv;
}
 
// &#207;&#238;&#232;&#241;&#234; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224; &#239;&#238; &#234;&#235;&#254;&#247;&#243;
Node *find(Node *const pbeg, int d)
{
Node *pv = pbeg;
while (pv)
{
 if (pv->d == d) break;
 pv = pv->next;
}
return pv;
}
 
// &#211;&#228;&#224;&#235;&#229;&#237;&#232;&#229; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224;
bool remove (Node **pbeg, Node **pend, int key)
{
if (Node *pkey = find(*pbeg, key))
 {
  if (pkey == *pbeg)
   {
     *pbeg = (*pbeg)->next;
     (*pbeg)->prev = 0;
   }
   else
    if (pkey == *pend)
     {
       *pend = (*pend)->prev;
       (*pend)->next = 0;
     }
    else
     {
      (pkey->prev)->next = pkey->next;
      (pkey->next)->prev = pkey->prev;
     }
     delete pkey;
     return true;
 }
 return false;
}
 
// &#194;&#241;&#242;&#224;&#226;&#234;&#224; &#253;&#235;&#229;&#236;&#229;&#237;&#242;&#224;
Node *insert(Node *const pbeg, Node **pend, int key, int d)
{
if (Node *pkey = find(pbeg, key))
{
 Node *pv = new Node;
 pv->d = d;
 // &#211;&#241;&#242;&#224;&#237;&#238;&#226;&#235;&#229;&#237;&#232;&#229; &#241;&#226;&#255;&#231;&#232; &#237;&#238;&#226;&#238;&#227;&#238; &#243;&#231;&#235;&#224; &#241; &#239;&#238;&#241;&#235;&#229;&#228;&#243;&#254;&#249;&#232;&#236;
 pv->next = pkey->next;
 // &#211;&#241;&#242;&#224;&#237;&#238;&#226;&#235;&#229;&#237;&#232;&#229; &#241;&#226;&#255;&#231;&#232; &#237;&#238;&#226;&#238;&#227;&#238; &#243;&#231;&#235;&#224; &#241; &#239;&#240;&#229;&#228;&#251;&#228;&#243;&#249;&#232;&#236;
 pv->prev = pkey;
 // &#211;&#241;&#242;&#224;&#237;&#238;&#226;&#235;&#229;&#237;&#232;&#229; &#241;&#226;&#255;&#231;&#232; &#239;&#240;&#229;&#228;&#251;&#228;&#243;&#249;&#229;&#227;&#238; &#243;&#231;&#235;&#224; &#241; &#237;&#238;&#226;&#251;&#236;
 pkey->next = pv;
 // &#211;&#241;&#242;&#224;&#237;&#238;&#226;&#235;&#229;&#237;&#232;&#229; &#241;&#226;&#255;&#231;&#232; &#239;&#238;&#241;&#235;&#229;&#228;&#243;&#254;&#249;&#229;&#227;&#238; &#243;&#231;&#235;&#224; &#241; &#237;&#238;&#226;&#251;&#236;
 if (pkey != *pend)
  (pv->prev) = pv;
  // &#206;&#225;&#237;&#238;&#226;&#235;&#229;&#237;&#232;&#229; &#243;&#234;&#224;&#231;&#224;&#242;&#229;&#235;&#255; &#237;&#224; &#234;&#238;&#237;&#229;&#246; &#241;&#239;&#232;&#241;&#234;&#224;
  // &#229;&#241;&#235;&#232; &#243;&#231;&#229;&#235; &#226;&#241;&#242;&#224;&#226;&#235;&#255;&#229;&#242;&#241;&#255; &#226; &#234;&#238;&#237;&#229;&#246;
  else
   *pend = pv;
   return pv;
}
return 0;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 pbeg = first(1);
 pend = pbeg; // &#239;&#229;&#240;&#226;&#251;&#233; &#253;&#235;&#229;&#236;&#229;&#237;&#242; &#255;&#226;&#235;&#255;&#229;&#242;&#241;&#255; &#232; &#239;&#238;&#241;&#235;&#229;&#228;&#237;&#232;&#236;
 
 for (int i = 2; i<6; i++)
  add(&pend, i);
 
  insert(pbeg, &pend, 2, 200);
  if (!remove(&pbeg, &pend, 5))
   Memo1->Lines->Add("&#205;&#229; &#237;&#224;&#233;&#228;&#229;&#237;");
 
   Node *pv = pbeg;
   while(pv)
    {
      Memo1->Lines->Add(IntToStr(pv->d));
      pv = pv->next;
    }
}
//---------------------------------------------------------------------------
 

Поясните плиз (у самого видать серого вещества не хватает) как работают вот эти строчки кода
(pkey->prev)->next = pkey->next;
(pkey->next)->prev = pkey->prev;
в функции remove
как вообще возможна такая конструкция (pkey->prev)->next
Записан
Sergey1985
Участник
**

Сказали спасибо: +8/-1
Offline Offline

Сообщений: 310


« Ответ #1 : 14 июля 2018, 19:20:53 »

И еще сразу же в дополнении : Зачем в функциях в качестве аргументов использовать не указатели, а указатели на указатели. Это дело вкуса или так работать будет лучше
Записан
Hex
Участник
**

Сказали спасибо: +16/-3
Offline Offline

Сообщений: 38


« Ответ #2 : 06 декабря 2018, 21:28:59 »

1. присвоение одному указателю значения другого. что не так? и кстати, скобочки можно выкинуть.
2. так в "стиле Си" передают в функцию массив указателей (указатель на указатель). RTFM.
  но в данном коде это просто дурь автора и лишние операции внутри функции, реально используется только 1 элемент.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: