0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 5
1

Динамические структуры данных. Организация данных в списковые структуры

16.11.2011, 20:16. Показов 4892. Ответов 6
Метки нет (Все метки)

Написать программу, формирующую два списка, заполняя их числами из файлов. Объединить оба списка в один, вставляя элементы поочередно то из одного, то из другого списка.

Тему в поиске нашел, но ответа в ней нет.

Прошу схематичный код, дальше сам. Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2011, 20:16
Ответы с готовыми решениями:

Динамические структуры данных, списковые структуры (надо разобраться что делает программа)
дана программа, надо помочь выяснить что в ней делает каждая подпрограмма unit Unit6; ...

Динамические структуры данных: добавление данных в конец
Нужно реализовать такую структуру данных (динамическую естественно ) которая имеет такие...

Динамические структуры данных
Никогда д этого не приходилось работать с динамическими типами данных, помогите решить такую вот...

Динамические структуры данных
Народ помогите с задачей!! С чего начать? Написать прогу для слияния двух отсортированных списков...

6
13087 / 5868 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
16.11.2011, 23:33 2
Здесь можно использовать односвязанные списки. Понадобится 2 процедуры работы со списком - добавление элемента в конец списка и удаление всего списка из памяти. Затем, с помощью этих процедур надо решать задачу, согласно условию.
---
Процедуры работы со списком:
Delphi
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
type
  //Типы для описания списка.
 
  //Тип основных данных.
  TData = Integer;
  
  //Тип, описывающий элемент списка.
  TPElem = ^TElem;
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
  
  //Тип, описывающий список.
  TDList = record
    PFirst : TPElem;
    PLast : TPElem;
  end;
 
//Процедуры для работы со списком.
 
//Удаление всего списка из памяти и инициализация.
procedure ListFree(var aList : TDList);
var
  PNext, PDel : TPElem;
begin
  if aList.PFirst = nil then Exit;
 
  PNext := aList.PFirst;
  while PNext <> nil do begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
 
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
//Добавление элемента в конец списка.
procedure AddL(var aList : TDList; var aPElem : TPElem);
begin
  if aPElem = nil then Exit;
 
  aPElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := aPElem
  else
    aList.PLast^.PNext := aPElem
  ;
  aList.PLast := aPElem;
end;
Распечатать элементы такого списка можно так:
1. В GUI приложении, вывод в TMemo:
Delphi
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
var
  List : TDList
  PElem : TPElem;
  S : String;
...
begin
...
  //Начальная инициализация списка.
  List.PFirst := nil;
  List.PLast := nil;
...
  //Распечатка списка в Мемо.
  if List.PFirst <> nil then begin
    Memo1.Lines.Add('Элементы списка:');
    S := '';
    PElem := List.PFirst;
    while PElem <> nil do begin
      if S <> '' then S := S + ', '; //Или: S := S + #9;
      S := S + IntToStr(PElem^.Data);
    end;
    Memo1.Lines.Add(S);
  end else
    Memo1.Lines.Add('Список пуст.')
  ;
...
  //Удаление списка из памяти.
  ListFree(List);
...
end;
2. В консольном приложении, вывод в окно консоли:
Delphi
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
39
40
41
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Windows;
...
var
  List : TDList
  PElem : TPElem;
...
begin
  //Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  //Если после переключения русские буквы показываются неверно,
  //следует открыть системное меню консольного окна - щелчком мыши в левом
  //верхнем углу окна консоли и выбрать:
  //Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
...
  //Начальная инициализация списка.
  List.PFirst := nil;
  List.PLast := nil;
...
  //Распечатка списка.
  if List.PFirst <> nil then begin
    Writeln('Элементы списка:');
    PElem := List.PFirst;
    while PElem <> nil do begin
      if PElem <> List.PFirst then Write(', '); //Или: Write(#9);
      Write(PElem^.Data);
    end;
    Writeln;
  end else
    Writeln('Список пуст.')
  ;
...
  //Удаление списка из памяти.
  ListFree(List);
...
end.
0
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 5
20.11.2011, 07:09  [ТС] 3
А как записать в память из файла?

Добавлено через 59 минут
И, если можно, дайте комментарии к переменным. Очень хочется понять задачу.
0
13087 / 5868 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
20.11.2011, 15:39 4
Полностью решение будет выглядеть так:
Delphi
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
type
  //Типы для описания списка.
 
  //Тип основных данных.
  TData = Integer;
  
  //Тип, описывающий элемент списка.
  TPElem = ^TElem;
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
  
  //Тип, описывающий список.
  TDList = record
    PFirst : TPElem;
    PLast : TPElem;
  end;
 
//Процедуры для работы со списком.
 
//Удаление всего списка из памяти и инициализация.
procedure ListFree(var aList : TDList);
var
  PNext, PDel : TPElem;
begin
  if aList.PFirst = nil then Exit;
 
  PNext := aList.PFirst;
  while PNext <> nil do begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
 
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
//Добавление элемента в конец списка.
procedure AddL(var aList : TDList; var aPElem : TPElem);
begin
  if aPElem = nil then Exit;
 
  aPElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := aPElem
  else
    aList.PLast^.PNext := aPElem
  ;
  aList.PLast := aPElem;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn1 = 'file1.dat';
  Fn2 = 'file2.dat';
  M = 10;
  N = 100;
var
  F : file of Integer;
  List1, List2, List3 : TDList;
  PElem : TPElem;
  i : Integer;
  Data : TData;
  S, FileName1, FileName2 : String;
begin
  //Полные имена файлов. Эти файлы будут записаны
  //в той же папке, где лежит исполняемый файл программы.
  FileName1 := ExtractFilePath( ParamStr(0) ) + Fn1;
  FileName2 := ExtractFilePath( ParamStr(0) ) + Fn2;
 
  //Записываем в файлы случайные значения.
  //Первый файл.
  AssignFile(F, FileName1);
  Rewrite(F);
  Randomize;
  for i := 1 to 5 + Random(M) do begin
    Data := Random(N);
    Write(F, Data);
  end;
  CloseFile(F);
  
  //Второй файл.
  AssignFile(F, FileName2);
  Rewrite(F);
  Randomize;
  for i := 1 to 5 + Random(M) do begin
    Data := Random(N);
    Write(F, Data);
  end;
  CloseFile(F);
 
  //Инициализация списков.
  List1.PFirst := nil;
  List1.PLast := nil;
  List2.PFirst := nil;
  List2.PLast := nil;
  List3.PFirst := nil;
  List3.PLast := nil;
 
  Memo1.Lines.Add('--------------------------------------------------');
 
  //Читаем элементы из первого файла и добавляем их в первый список.
  AssignFile(F, FileName1);
  Reset(F);
  while not Eof(F) do begin
    New(PElem);
    Read(F, PElem^.Data);
    AddL(List1, PElem);
  end;
  CloseFile(F);
  //Распечатка первого списка в Мемо.
  S := '';
  PElem := List1.PFirst;
  while PElem <> nil do begin
    if S <> '' then S := S + #9;
    S := S + IntToStr(PElem^.Data);
    PElem := PElem^.PNext;
  end;
  if S <> '' then begin
    Memo1.Lines.Add('Элементы первого списка:');
    Memo1.Lines.Add(S);
  end else
    Memo1.Lines.Add('Первый список пуст.')
  ;
 
  //Читаем элементы из второго файла и добавляем их во второй список.
  AssignFile(F, FileName2);
  Reset(F);
  while not Eof(F) do begin
    New(PElem);
    Read(F, PElem^.Data);
    AddL(List2, PElem);
  end;
  CloseFile(F);
  //Распечатка второго списка в Мемо.
  S := '';
  PElem := List2.PFirst;
  while PElem <> nil do begin
    if S <> '' then S := S + #9;
    S := S + IntToStr(PElem^.Data);
    PElem := PElem^.PNext;
  end;
  if S <> '' then begin
    Memo1.Lines.Add('Элементы второго списка:');
    Memo1.Lines.Add(S);
  end else
    Memo1.Lines.Add('Второй список пуст.')
  ;
 
  //Из элементов двух списков составляем третий список.
  //Будем поочередно брать элементы то из первого, то из второго
  //списка и переносить их в третий список.
  //Цикл выполняется, пока не пуст первый список.
  while List1.PFirst <> nil do begin
    //Берём из начала первого списка очередной элемент
    //и переносим его в конец третьего списка.
    PElem := List1.PFirst^.PNext;
    AddL(List3, List1.PFirst);
    List1.PFirst := PElem;
    //Если второй список не пуст, берём из его начала очередной
    //элемент и переносим его в третий список.
    if List2.PFirst <> nil then begin
      PElem := List2.PFirst^.PNext;
      AddL(List3, List2.PFirst);
      List2.PFirst := PElem;
    end;
  end;
  //Дописываем в третий список элементы из второго списка, в случае,
  //если он оказался длиннее, чем первый.
  while List2.PFirst <> nil do begin
    PElem := List2.PFirst^.PNext;
    AddL(List3, List2.PFirst);
    List2.PFirst := PElem;
  end;
 
  //Распечатка третьего списка в Мемо.
  S := '';
  PElem := List3.PFirst;
  while PElem <> nil do begin
    if S <> '' then S := S + #9;
    S := S + IntToStr(PElem^.Data);
    PElem := PElem^.PNext;
  end;
  if S <> '' then begin
    Memo1.Lines.Add('Элементы третьего списка:');
    Memo1.Lines.Add(S);
  end else
    Memo1.Lines.Add('Третий список пуст.')
  ;
  //Удаляем списки из паяти.
  //Особенность алгоритма такая, что в настоящий момент
  //первый и второй списки пустые - т. к., все их элементы
  //перенесены в третий список. Тем не менее, операцию удаления
  //из памяти выполним для всех списков - это повышает надёжность
  //программы на случай, если в будущем алгоритм будет изменён.
  ListFree(List1);
  ListFree(List2);
  ListFree(List3);
  Memo1.Lines.Add('Все списки удалены из памяти.');
end;
Здесь программа построена так, что количество элементов в первом и втором списках может быть разным.
---
tututu, если какие-то участки программы непонятны - задавай вопросы.
1
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 5
20.11.2011, 22:45  [ТС] 5
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
  //Типы для описания списка.
 
  //Тип основных данных.
  TData = Integer;
  
  //Тип, описывающий элемент списка.
  TPElem = ^TElem;
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
  
  //Тип, описывающий список.
  TDList = record
    PFirst : TPElem;
    PLast : TPElem;
  end;
вот это самое непонятное место. в методичке пара слов об этом. на деле ничего не понятно как работать с динамическими данными. объясни, пожалуйста, как тут работает описание, вместе с записями. про тип запись я сейчас почитаю, но все же...
0
13087 / 5868 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
20.11.2011, 23:04 6
Здесь принцип такой: каждый элемент списка - это запись типа:
Pascal
1
2
3
4
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
В такой записи 2 поля: Data - это основные данные элемента. В нашем случае Data - это целое число. Второе поле: PNext - это указатель на следующий элемент в списке. Благодаря этому полю и создаётся список. Т. е. каждый элемент списка "знает" о следующем элементе в списке. Если PNext равен NIL, то это означает, что следующего элемента в списке нет.
Объявления типов построены так:
1. Сначала объявлен тип, определяющий указатель на элемент списка:
Pascal
1
TPElem = ^TElem;
Такое объявление называется "опережающим описанием". - Потому что тип TElem ещё не определён. И мы определяем тип TPElem на основе этого ещё не определённого типа.
2. Теперь мы описываем тип TElem - он определяет тип элемента списка:
Pascal
1
2
3
4
  TElem = record
    Data : TData;
    PNext : TPElem;
  end;
В этой записи поле PNext принадлежит тому самому типу TPElem, который ранее был объявлен с помощью опережающего описания. Вот именно по этому нам и понадобилось опережающее описание - чтобы на тот момент, когда мы определяем тип элемента списка, уже был известен тип, задающий указатель на этот же элемент списка. Чтобы в этом определении не запутаться, надо иметь в виду два факта: 1. мы задали тип, описывающий указатель на элемент списка; 2. и мы задали тип, который описывает сам элемент списка.
---
Далее идёт описание типа списка:
Delphi
1
2
3
4
  TDList = record
    PFirst : TPElem;
    PLast : TPElem;
  end;
Этот тип описывает запись, которая содержит 2 поля - первое поле PFirst - это указатель на первый элемент списка, а второе поле - PLast - это указатель на последний элемент списка. Такая структура очень удобна. Например, если нам надо добавить в конец списка новый элемент, то нам не понадобится выполнять перебор всех элементов списка, начиная от его начала, чтобы дойти до последнего элемента. - Благодаря полю PLast мы сразу можем получить указатель на последний элемент в списке и можем добавить новый элемент в конец списка.
2
429 / 337 / 36
Регистрация: 31.05.2011
Сообщений: 1,156
20.11.2011, 23:43 7
ха, прикольно)))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2011, 23:43
Помогаю со студенческими работами здесь

Динамические структуры данных
Нужна помощь. Со списками дела плохо, сколько читал, смотрел, никак не идет. :wall: Нужно с...

Динамические структуры данных
Списки.Задание: Двусвязный список: создание, добавление в начало, удаление первого элемента...

Динамические структуры данных. Списки
Нужна помощь с задачей по спискам. Как создать список из последовательности символов введенных с...

Динамические структуры данных (список)
Доброй ночи,вот задание : Опишите и постройте с помощью двумерного массива Sps линейный...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru