IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Как добавить новую запись в динамический список?
alex457
сообщение 17.04.2012 20:23
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: alex

Репутация: -  0  +


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

Создание списка:

Assign(Data,Path);
Reset(Data);
l:=nil;
i:=0;
while not eof(Data) do
begin
inc(i);
Seek(Data,i);
Read(Data, Symbol);
new(t);
t^.key := i;
t^.row := Symbol;
t^.next := l;
l:=t;
end;
CountRecords := i;
Close(Data);




Вывод всех записей:

while ( t <> nil) do
begin

write(t^.row.SurName);
write(t^.row.Name);
write(t^.row.FullName);
write(t^.row.BhirtDay);
writeln(t^.row.Identity);
t:=t^.Next;
end;
end;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
P@sh@
сообщение 20.04.2012 11:11
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

Репутация: -  2  +


1. благодаря Seek файл будет загружаться со 2-го элемента, а не с начала... и в некоторых случаях может быть ошибка чтения
2. в загрузке поле next указывает на предыдущий элемент, а не на следующий, поэтому при работе второго блока все выведется задом наперед, с конца
3. после вывода переменная t будет nil, поэтому начало списка надо хранить где-то... чтоб потом корректно удалить хотя бы

а по вопросу:
сначала надо найти нужный элемент (пройтись по ссылкам с начала списка) - допустим в переменную t1
потом вставить (это если порядок будет прямой, а не обратный, как сейчас):
new(t);
t.data:=....;
t.next:=t1.next;
t1.next:=t;

Сообщение отредактировано: P@sh@ - 20.04.2012 11:12
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 12.02.2013 9:59
Сообщение #3


Гость






doors.txt;5
 К началу страницы 
+ Ответить 
Гость
сообщение 12.02.2013 22:18
Сообщение #4


Гость






doors.txt;5
 К началу страницы 
+ Ответить 
Гость
сообщение 13.02.2013 11:00
Сообщение #5


Гость






doors.txt;10
 К началу страницы 
+ Ответить 
Assassin
сообщение 13.02.2013 17:11
Сообщение #6





Группа: Пользователи
Сообщений: 3
Пол: Мужской

Репутация: -  0  +


Разработать программу получения и обработки одномерного массива, состоящую из 4 частей.
Часть 1. Вычислить значения 32 элементов одномерного целочисленного массива T в интервале (-8,8) с использованием генератора случайных чисел.
Часть 2. Вычислить среднеарифметическое значение нечетных по номеру элементов последней трети массива.
Часть 3. Определить два наибольших элемента, среди отрицательных элементов первой четверти массива.
Часть 4. Упорядочить чётные по номеру элементы всего массива по возрастанию модулей обратных.

где у меня ошибки
Program Work_4;
Type vector=array[1..100] of integer;
var c,buf,Vr, n, i, a, b: integer;
G: vector;
Sg,P: real;

Procedure Part_1(Vr,n,a,b:integer; var G:vector);
var i:integer;
Begin
If Vr<>1 then randomize;
for i:=1 to n do g[i]:=a+Round((b-a)*Random(100)/100);
end;


Procedure Part_2(n:integer; G:vector; var Sg:real);
var i,k:integer;
P:real;




Begin
P:=1;
k:=0;
For i:=1 to (n div 3)*2+1 do
if i mod 2=1 then
begin
inc(g[i]);
inc(k);
end;
writeln;
if k=0 then writeln('Нет четных элементов в последней трети массива')
else writeln('Ср.ар=',P/k:7:2);
end;


Procedure Part_3(n:integer; G:vector);
var i,k,max,max2:integer;
Begin

k:=0;
max:=g[1];
max2:= g[2];

If g[i]<0 then
while (i<n) do
begin


if max < max2 then
begin
max:=g[2];
max2:=g[1];
end;
For i:=1 to n div 4 do
if g[i]>max then
begin
max2:=max;
max:=g[i];
end
else
if g[i]>max2 then
max2:=g[i];
end;

begin
writeln('max1=',max,'max2',max2);
end;
k:=k+1;
end;



Procedure Part_4(n:integer; var Num,A,B:vector);
var i, temp, m, j: integer;
f: boolean;
Begin
for i:=1 to n do begin
A[i]:=random(20)+1;
write(A[i]:4);
end;
writeln;
m:=0;
for i:=2 to n div 2 do begin
if i mod 2 = 0 then begin
inc(m);
B[m]:=A[i];
num[m]:=i;
end;
end;

for i:=1 to m do begin
write(B[i]:4);
end;

writeln;

for i:= 1 to m - 1 do
for j:=1 to m - i do
if Abs(1/b[j]) < Abs(1/b[j+1]) then begin
temp:=b[j];
b[j]:=b[j+1];
b[j+1]:=temp;
end;

for i:=1 to n do begin
f:=false;
j:=0;
repeat
inc(j);
if num[j] = i then f:=true;
until f or ( j = m );
if f then write(B[j]:4) else write(A[i]:4);
end;
readln;
end;


begin
write('введите вариант расчета Vr => ');
readln(Vr);
if Vr=0 then
begin
n:=25; a:=-8; b:=7; c:=2;
g[1] := 1; g[2] := 0; g[3] :=-3; g[4] := 2; g[5] := 0;
g[6] :=-3; g[7] := 4; g[8] := 3; g[9] := 2; g[10]:= 0;
g[11]:= 0; g[12]:= 4; g[13]:= 0; g[14]:=-2; g[15]:=-1;
g[16]:=-1; g[17]:= 1; g[18]:=-5; g[19]:= 0; g[20]:= 6;
g[21]:= 2; g[22]:=-7; g[23]:=-5; g[24]:= 1; g[25]:= 3;
end
else
begin
Write('Vvedite n,a,b => '); readln(n,a,b);
Part_1(Vr,n,a,b,g);
end;
for i:=1 to n do write(g[i],' ' );



end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 6.11.2024 8:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"