2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Списковые структуры
Сообщение20.05.2011, 21:33 


20/05/11
22
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
  1. var
  2.   Form1: TForm1;
  3.    name1,autors1,year1,number1,out1,kol1,nal1:Text;
  4.   s:string;
  5. implementation
  6.  
  7. {$R *.dfm}
  8.    type
  9.    PNode=^TNode;
  10.    TNode=record
  11.    Info:string;
  12.    autor:string;
  13.    year:string;
  14.    number:string;
  15.    cnt:Integer;
  16.    nal:Integer;
  17.    Next:PNode
  18.    end;
  19.    var q:PNode;[/color]
  20.  
  21.  
  22.  
  23. procedure TForm1.FormCreate(Sender: TObject);
  24. var
  25. i:integer;
  26. r:PNode;
  27. c:string;
  28. begin
  29.  
  30.  
  31.  Try
  32.  assignFile(name1,'Name.txt');
  33.  Reset(name1);
  34.   for i:=1 to Form1.StringGrid1.RowCount do
  35.   begin
  36.    Readln(name1,s);
  37.    StringGrid1.Cells[1,i]:=s;
  38.   end;
  39.    CloseFile(name1);
  40.  
  41.  except
  42.   assignFile(name1,'Name.txt');
  43.   Rewrite(name1);
  44.  
  45.  
  46.  end;
  47.  
  48.   Try
  49.  assignFile(autors1,'Autors.txt');
  50.  Reset(autors1);
  51.   for i:=1 to Form1.StringGrid1.RowCount do
  52.   begin
  53.    Readln(autors1,s);
  54.    StringGrid1.Cells[2,i]:=s;
  55.   end;
  56.    CloseFile(autors1);
  57.  except
  58.   assignFile(autors1,'Autors.txt');
  59.   Rewrite(autors1);
  60.  
  61.  end;
  62.  
  63.   Try
  64.  assignFile(year1,'Year.txt');
  65.  Reset(year1);
  66.   for i:=1 to Form1.StringGrid1.RowCount do
  67.   begin
  68.    Readln(year1,s);
  69.    StringGrid1.Cells[3,i]:=s;
  70.   end;
  71.    CloseFile(year1);
  72.  except
  73.   assignFile(year1,'Year.txt');
  74.   Rewrite(year1);
  75.  
  76.  end;
  77.  
  78.   Try
  79.  assignFile(number1,'Number.txt');
  80.  Reset(number1);
  81.  for i:=1 to Form1.StringGrid1.RowCount do
  82.   begin
  83.    Readln(number1,s);
  84.    StringGrid1.Cells[5,i]:=s;
  85.   end;
  86.    CloseFile(number1);
  87.  except
  88.   assignFile(number1,'Number.txt');
  89.   Rewrite(number1);
  90.  
  91.  end;
  92.  
  93.  Try
  94.  assignFile(kol1,'kol.txt');
  95.  Reset(kol1);
  96.  for i:=1 to Form1.StringGrid1.RowCount do
  97.   begin
  98.    Readln(kol1,s);
  99.    StringGrid1.Cells[6,i]:=s;
  100.   end;
  101.    CloseFile(kol1);
  102.  except
  103.   assignFile(kol1,'kol.txt');
  104.   Rewrite(kol1);
  105.  
  106.  end;
  107.  
  108.   Try
  109.  assignFile(out1,'Out.txt');
  110.  Reset(out1);
  111.     for i:=1 to Form1.StringGrid1.RowCount do
  112.   begin
  113.    Readln(out1,s);
  114.    StringGrid1.Cells[4,i]:=s;
  115.   end;
  116.    CloseFile(out1);
  117.  except
  118.   assignFile(out1,'Out.txt');
  119.   Rewrite(out1);
  120.  
  121.  
  122.  end;
  123.  i:=1;
  124.  c:='';
  125.  new(r);
  126.  r.Info:=StringGrid1.Cells[1,i];
  127.  r.autor:=StringGrid1.Cells[2,i];
  128.  r.year:=StringGrid1.Cells[3,i];
  129.  r.number:=StringGrid1.Cells[4,i];
  130.  r.cnt:=Strtoint(StringGrid1.Cells[5,i]);
  131.  r.nal:=Strtoint(StringGrid1.Cells[6,i]);
  132.  r.Next:=nil;
  133. q:=r;
  134.                   r:=q^.Next;
  135.  
  136. for i:=2 downto Form1.StringGrid1.RowCount-2 do begin new(r);
  137.                   with r^ do  begin
  138.                                          Info:=StringGrid1.Cells[1,i];
  139.                                          autor:=StringGrid1.Cells[2,i];
  140.                                          year:=StringGrid1.Cells[3,i];
  141.                                          number:=StringGrid1.Cells[4,i];
  142.                                          cnt:=StrtoInt(StringGrid1.Cells[5,i]);
  143.                                          nal:=Strtoint(StringGrid1.Cells[6,i]);
  144.                                          Next:=nil;
  145.                                         end;
  146.                   r:=r^.Next;
  147.                  end;    
  148.  
  149. end;


Не могли бы мне подсказать, почему в односвязном списке после активации формы у меня появляется только первый элемент, а остальные он как-будто не находит(((Что-то неправильно?

 i  Модератор Toucan:
Убрал цветовыделение, добавил тег syntax

 Профиль  
                  
 
 Re: Списковые структуры
Сообщение21.05.2011, 02:15 
Заслуженный участник


26/07/09
1559
Алматы
2Natalya23
Вы какую-то глупость там написали. :) Для внесения ясности, рекомендую вам нарисовать ваш связанный список на бумаге. Поле Next должно содержать адрес следующего элемента списка.

Конкретно по вашему коду возникли следующие вопросы. Например, зачем вам нужны строки 125-132? Их следует удалить. Также непонятно, почему в 136 строке использовано ключевое слово downto вместо to. Надо бы исправить. Да и цикл тот стоит начинать с единицы, а не с двойки.

По существу, ошибка вот в чем. Допустим вы хотите добавить добавить новый элемент в начало списка. Для этого вам нужно создать этот элемент через new(r), заполнить поля и положить в поле Next адрес начала списка, уже построенного до этого момента. Я так понял, на начало списка у вас указывает q, поэтому надо в 144 строке писать не Next:=nil, а Next:=q. И уже после этого можно "направить" q на только что выделенный новый элемент, q:=r. А в 133 строке, перед построением списка, q должна быть инициализирована нулевым указателем, q:=nil.

Если же вы хотите добавить новый элемент в конец списка, то удобно будет завести ещё одну переменную-указатель, специально для хранения адреса конца. То есть, в результате у вас будет две переменные, q и, скажем, e; одна будет указывать на начало, а другая на конец, причем обе изначально равны nil. После того как вы создали новый элемент через new (положив в поле Next значение nil), вы должны проверить чему равно значение e, если там по-прежнему хранится нулевой указатель, т.е., если список ещё пуст, то вы должны всего-лишь запомнить только что созданный первый элемент: q=r; e=r. В противном случае, если элементы в списке уже есть, то вы должны связать последний до этого имевшийся элемент списка с новым, т.е., выполнить e^.Next=r; а потом "передвинуть" указатель конца списка, чтобы он указывал на новый настоящий конец списка: e=r.

Вот я вам предложил два способа пополнения списка; какой из них вы пытались применить я так и не понял, поэтому выбирайте сами. И ещё раз напоминаю о трюке с бумажкой.

P.S.: При работе с типизированными указателями на записи правильнее все-таки писать q^.Next, а не q.Next, хотя object pascal позволяет использовать оба варианта (это нужно для красивой работы с классами).

 Профиль  
                  
 
 Re: Списковые структуры
Сообщение21.05.2011, 08:51 


20/05/11
22
Спасибо большое!)Я там столько всего перепробовала, что без вас бы точно не разобралась!)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group