3 / 3 / 1
Регистрация: 20.11.2012
Сообщений: 197
1

Осуществить добавление и удаление указанного элемента списка

22.12.2012, 21:01. Показов 13201. Ответов 3

Author24 — интернет-сервис помощи студентам
1.реализовать динамические структуры данных список, очередь, стеки. В каждом случае осуществить добавление и удаление указанного элемента.

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

3.написать программу в которой создается n записей для хранения целых чисел. Все записи указывают одна на другую. Вывести числа в обратном порядке.

помогите пожалуйста((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2012, 21:01
Ответы с готовыми решениями:

Добавление элемента в конец списка
procedure AddLast(value: string); {Dobavlenie elementa v konec spiska} var Item: PList; begin...

Удаление n-го элемента из списка
Задание: удаление n-го элемента из списка uses crt; type TInf = integer; TNode = ^Node;...

Удаление n-го элемента из списка
удаление n-го элемента из списка

Удаление элемента из списка
Подскажите, есть список spis. В нем 5 параметров. Необходимо удалить элемент списка, параметр "god"...

3
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
23.12.2012, 00:08 2
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от KathrineY Посмотреть сообщение
1.реализовать динамические структуры данных список, очередь, стеки. В каждом случае осуществить добавление и удаление указанного элемента.
Решение для списка (однонаправленный список).
Pascal
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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
program Project1;
 
type
  //Тип основных данных.
  TData = Integer;
  //Указатель на элемент списка.
  TPElem = ^TElem;
  //Элемент списка.
  TElem = record
    Data : TData; //Основные данные.
    PNext : TPElem; //Указатель на следующий элемент.
  end;
  //Список.
  TDList = record
    Cnt : Integer; //Количество элементов в списке.
    PFirst, PLast : TPElem; //Указатели на первый и на последний элементы списка.
  end;
 
//Процедура инициализации списка. Внимание! Эту процедуру можно выполнять
//только в отношении пустого списка. Иначе, произойдёт утечка памяти.
procedure Init(var aList : TDList);
begin
  aList.Cnt := 0;
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
//Добавление элемента в конец списка.
procedure Add(var aList : TDList; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := PElem
  else
    aList.PLast^.PNext := PElem;
  aList.PLast := PElem;
  Inc(aList.Cnt);
end;
 
//Освобождение памяти, занятой под список.
procedure ListFree(var aList : TDList);
var
  PElem, PDel : TPElem;
begin
  PElem := aList.PFirst;
  while PElem <> nil do begin
    PDel := PElem;
    PElem := PElem^.PNext;
    Dispose(PDel);
  end;
  Init(aList);
end;
 
//Распечатка всего списка.
procedure Print(var aList : TDList);
var
  PElem : TPElem;
  i : Integer;
begin
  PElem := aList.PFirst;
  i := 0;
  while PElem <> nil do begin
    Inc(i);
    if i > 1 then Write(', ');
    Write(PElem^.Data);
    PElem := PElem^.PNext;
  end;
  Writeln;
end;
 
//Удаление элемента из однонаправленного списка по указателю на предыдущий элемент.
//Если указатель на предыдущий элемент равен NIL, то удаляется первый элемент списка.
procedure Del(var aList : TDList; var aPPrev : TPElem);
var
  PDel : TPElem;
begin
  if aList.PFirst = nil then Exit;
 
  if aPPrev = nil then begin
    PDel := aList.PFirst;
    aList.PFirst := PDel^.PNext;
  end else begin
    PDel := aPPrev^.PNext;
    if PDel <> nil then aPPrev^.PNext := PDel^.PNext;
  end;
  if aList.PLast = PDel then aList.PLast := aPPrev;
  if PDel <> nil then begin
    Dispose(PDel);
    Dec(aList.Cnt);
  end;
end;
 
//Удаление из списка элементов с заданным значением.
function DelByVal(var aList : TDList; const aData : TData) : Integer;
var
  PElem, PPrev : TPElem;
  Cnt : Integer;
begin
  Cnt := 0;
  PPrev := nil; //Указатель на предыдущий элемент.
  PElem := aList.PFirst; //Указатель на текущий элемент.
  while PElem <> nil do begin
    if PElem^.Data = aData then begin
      //Переход к следующему элементу надо выполнить перед вызовом Del(), потому
      //что процедура Del() удалит текущий элемент.
      PElem := PElem^.PNext;
      Del(aList, PPrev);
      Inc(Cnt);
    end else begin
      PPrev := PElem;
      PElem := PElem^.PNext;
    end;
  end;
  DelByVal := Cnt; //Количество удалённых элементов.
end;
 
//Добавление элементов в список.
procedure WorkAdd(var aList : TDList);
var
  S : String;
  Data : TData;
  Code : Integer;
begin
  Writeln('Добавьте элементы в список.');
  Writeln('Ввод каждого значения завершайте нажатием Enter.');
  Writeln('Чтобы прекратить ввод оставьте пустую строку и нажмите Enter.');
  repeat
    Write('Элемент №', aList.Cnt + 1, ': ');
    Readln(S);
    if S = '' then begin
      Writeln('Элемент не добавлен.');
      Code := 0;
    end else begin
      Val(S, Data, Code);
      if Code = 0 then begin
        Add(aList, Data);
        Writeln('Элемент добавлен.');
        Code := 1;
      end else
        Writeln('Неверный ввод. Повторите.');
    end;
  until Code = 0;
  Writeln('Ввод элементов списка завершён.');
end;
 
var
  L : TDList;
  Data : TData;
  Cmd, Code, Cnt : Integer;
  S : String;
begin
  //Начальная инициализация списка.
  Init(L);
 
  repeat
    //Меню
    Writeln('Выберите действие:');
    Writeln('1: Добавление элементов в список.');
    Writeln('2: Распечатка всего списка.');
    Writeln('3: Проверка списка на пустоту.');
    Writeln('4: Удаление элементов по условию.');
    Writeln('5: Удаление списка.');
    Writeln('6: Выход.');
    Write('Введите команду: ');
    Readln(Cmd);
    case Cmd of
      1: WorkAdd(L);
      2:
        if L.PFirst = nil then
          Writeln('Спиосок пуст.')
        else begin
          Writeln('Содержимое списка:');
          Print(L);
        end;
      3:
        if L.PFirst = nil then
          Writeln('Список пуст.')
        else
          Writeln('Список не пуст.');
      4:
      begin
        Writeln('Элементы с заданным значением будут удалены из списка.');
        Writeln('Чтобы отменить операцию оставьте пустую строку и нажмите Enter.');
        repeat
          Write('Значение: ');
          Readln(S);
          if S = '' then begin
            Writeln('Операция отменена.');
            Code := 0;
          end else begin
            Val(S, Data, Code);
            if Code = 0 then begin
              Cnt := DelByVal(L, Data);
              Writeln('Список обработан. Количество удалённых элементов: ', Cnt);
              Code := 1;
            end else
              Writeln('Неверный ввод. Повторите.');
          end;
        until Code = 0;
      end;
      5, 6:
      begin
        ListFree(L);
        Writeln('Список удалён из памяти (очищен).');
      end;
      else
        Writeln('Незарегистрированная команда. Повторите ввод.');
    end;
  until Cmd = 6;
 
  Writeln('Работа программы завершена. Для выхода нажмите Enter.');
  Readln;
end.
3
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
24.12.2012, 13:41 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от KathrineY Посмотреть сообщение
1.реализовать динамические структуры данных список, очередь, стеки. В каждом случае осуществить добавление и удаление указанного элемента.
Решение со стеком.
Pascal
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
program Project1;
 
type
  //Тип основных данных.
  TData = Integer;
  //Указатель на элемент стека.
  TPElem = ^TElem;
  //Элемент стека.
  TElem = record
    Data : TData; //Основные данные.
    PNext : TPElem; //Указатель на следующий элемент.
  end;
  //Для самого стека отдельный тип можно не создавать. Стек будет представлен в виде
  //указателя на элемент, расположенный на вершине стека. Поэтому, переменная,
  //представляющая стек, будет иметь тип TPElem.
 
//Добавление элемента на вершину стека.
procedure Push(var aPStack : TPElem; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := aPStack;
  aPStack := PElem;
end;
 
//Изъятие элемента с вершины стека.
//Если стек не пуст, то с вершины стека изымается элемент и его значение
//(основные данные) возвращается через параметр aData. В этом случае, функция
//возвращает значение True. Если стек пуст, то операция отменяется, а функция
//возвращает значение False.
function Pop(var aPStack : TPElem; var aData : TData) : Boolean;
var
  PElem : TPElem;
begin
  Pop := False;
  if aPStack = nil then Exit;
 
  PElem := aPStack;
  aPStack := PElem^.PNext;
  aData := PElem^.Data;
  Dispose(PElem);
  Pop := True;
end;
 
//Освобождение памяти, занятой стеком (очистка стека).
procedure StackFree(var aPStack : TPElem);
var
  Data : TData;
begin
  while Pop(aPStack, Data) do;
end;
 
//Распечатка элементов стека в направлении вершина - дно.
procedure Print(var aPStack : TPElem);
var
  PSt : TPElem;
  Data : TData;
  i : Integer;
begin
  //Начальная инициализация вспомогательного стека.
  PSt := nil;
  //Переливаем элементы из стека aPStack в стек PSt.
  i := 0;
  while Pop(aPStack, Data) do begin
    Push(PSt, Data);
    Inc(i);
    if i > 1 then Write(', ');
    Write(Data);
  end;
  Writeln;
  //Возвращаем элементы из стека PSt в aPStack.
  while Pop(PSt, Data) do Push(aPStack, Data);
end;
 
//Удаление из стека элементов с заданным значением.
//Функция возвращает количество удалённых элементов.
function Del(var aPStack : TPElem; const aData : TData) : Integer;
var
  PSt : TPElem;
  Data : TData;
  Cnt : Integer;
begin
  Del := 0;
  if aPStack = nil then Exit;
 
  //Начальная инициализация вспомогательного стека.
  PSt := nil;
  //Переливаем из стека aPStack в стек PSt элементы, значение которых
  //отличается от aData.
  Cnt := 0;
  while Pop(aPStack, Data) do
    if Data <> aData then
      Push(PSt, Data)
    else
      Inc(Cnt);
  //Возвращаем элементы из стека PSt в aPStack.
  while Pop(PSt, Data) do Push(aPStack, Data);
  Del := Cnt;
end;
 
//Диалог добавления элементов в стек.
procedure WorkAdd(var aPStack : TPElem);
var
  S : String;
  Data : TData;
  Code : Integer;
begin
  Writeln('Добавление элементов в стек.');
  Writeln('Ввод каждого значения завершайте нажатием Enter.');
  Writeln('Чтобы прекратить ввод оставьте пустую строку и нажмите Enter.');
  repeat
    Write('Значение: ');
    Readln(S);
    if S = '' then begin
      Writeln('Ввод элемента отменён.');
      Code := 0;
    end else begin
      Val(S, Data, Code);
      if Code = 0 then begin
        Push(aPStack, Data);
        Writeln('Элемент добавлен.');
        Code := 1;
      end else
        Writeln('Неверный ввод. Повторите.');
    end;
  until Code = 0;
  Writeln('Ввод элементов стека завершён.');
end;
 
var
  PSt : TPElem;
  Data : TData;
  Cmd, Code, Cnt : Integer;
  S : String;
begin
  //Начальная инициализация стека.
  PSt := nil;
 
  repeat
    //Меню
    Writeln('Выберите действие:');
    Writeln('1: Добавление элементов в стек.');
    Writeln('2: Распечатка стека.');
    Writeln('3: Проверка стека на пустоту.');
    Writeln('4: Удаление элементов по условию.');
    Writeln('5: Удаление стека (очистка).');
    Writeln('6: Выход.');
    Write('Введите команду: ');
    Readln(Cmd);
    case Cmd of
      1: WorkAdd(PSt);
      2:
        if PSt = nil then
          Writeln('Стек пуст.')
        else begin
          Writeln('Содержимое стека (вершина - дно):');
          Print(PSt);
        end;
      3:
        if PSt = nil then
          Writeln('Стек пуст.')
        else
          Writeln('Стек не пуст.');
      4:
      begin
        Writeln('Элементы с заданным значением будут удалены из стека.');
        repeat
          Write('Задайте значение: ');
          Readln(S);
          Val(S, Data, Code);
          if Code <> 0 then
            Writeln('Неверный ввод. Повторите.');
        until Code = 0;
        Writeln('Удалить элементы с заданным значением? д/н, y/n: ');
        Readln(S);
        if (S <> '') and (S[1] in ['Д', 'д', 'Y', 'y']) then begin
          Cnt := Del(PSt, Data);
          Writeln('Стек обработан. Количество удалённых элементов: ', Cnt);
        end else
          Writeln('Операция отменена.');
      end;
      5, 6:
      begin
        StackFree(PSt);
        Writeln('Стек удалён из памяти (очищен).');
      end;
      else
        Writeln('Незарегистрированная команда. Повторите ввод.');
    end;
  until Cmd = 6;
 
  Writeln('Работа программы завершена. Для выхода нажмите Enter.');
  Readln;
end.
2
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
25.12.2012, 15:42 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от KathrineY Посмотреть сообщение
1.реализовать динамические структуры данных список, очередь, стеки. В каждом случае осуществить добавление и удаление указанного элемента.
Решение с очередью.
Pascal
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
203
204
205
206
program Project1;
 
type
  //Основные данные.
  TData = Integer;
  //Указатель на элемент очереди.
  TPElem = ^TElem;
  //Элемент очереди.
  TElem = record
    Data : TData; //Основные данные.
    PNext : TPElem; //Указатель на следующий элемент очереди.
  end;
  //Очередь.
  TQueue = record
    PFirst, PLast : TPElem; //Указатели на первый и на последний элементы очереди.
  end;
 
//Начальная инициализация очереди. Внимание! Эту процедуру можно выполнять
//только в отношении пустой очереди. Иначе будут утечки памяти.
//Если очередь непуста, то следует применить вызов Free().
procedure Init(var aQueue : TQueue);
begin
  aQueue.PFirst := nil;
  aQueue.PLast := nil;
end;
 
//Добавление элемента в конец очереди.
procedure Push(var aQueue : TQueue; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aQueue.PFirst = nil then
    aQueue.PFirst := PElem
  else
    aQueue.PLast^.PNext := PElem;
  aQueue.PLast := PElem;
end;
 
//Изъятие элемента из начала очереди. Если очередь не пуста, то
//из начала очереди извлекается элемент и его значение возвращается
//через параметр aData. В этом случае функция возвращает True.
//Если очередь пуста, то операция отменяется и функция возвращает False.
function Pop(var aQueue : TQueue; var aData : TData) : Boolean;
var
  PElem : TPElem;
begin
  Pop := False;
  if aQueue.PFirst = nil then Exit;
 
  PElem := aQueue.PFirst;
  aData := PElem^.Data;
  aQueue.PFirst := PElem^.PNext;
  if aQueue.PFirst = nil then Init(aQueue);
  Dispose(PElem);
  Pop := True;
end;
 
//Удаление очереди из памяти (очистка очереди).
procedure Free(var aQueue : TQueue);
var
  Data : TData;
begin
  while Pop(aQueue, Data) do;
end;
 
//Распечатка очереди.
procedure Print(var aQueue : TQueue);
var
  Q : TQueue;
  Data : TData;
  i : Integer;
begin
  Init(Q);
  i := 0;
  while Pop(aQueue, Data) do begin
    Push(Q, Data);
    Inc(i);
    if i > 1 then Write(', ');
    Write(Data);
  end;
  Writeln;
  aQueue := Q;
end;
 
//Удаление из очереди элементов с заданным значением.
//Функция возвращает количество удалённых элементов.
function Del(var aQueue : TQueue; const aData : TData) : Integer;
var
  Q : TQueue;
  Data : TData;
  Cnt : Integer;
begin
  Del := 0;
  if aQueue.PFirst = nil then Exit;
 
  //Начальная инициализация вспомогательного очереди.
  Init(Q);
  //Переливаем из очереди aQueue в очередь Q элементы, значение которых
  //отличается от aData.
  Cnt := 0;
  while Pop(aQueue, Data) do
    if Data <> aData then
      Push(Q, Data)
    else
      Inc(Cnt);
  aQueue := Q;
  Del := Cnt;
end;
 
//Диалог добавления элементов в очередь.
procedure WorkAdd(var aQueue : TQueue);
var
  S : String;
  Data : TData;
  Code : Integer;
begin
  Writeln('Добавление элементов в очередь.');
  Writeln('Ввод каждого значения завершайте нажатием Enter.');
  Writeln('Чтобы прекратить ввод оставьте пустую строку и нажмите Enter.');
  repeat
    Write('Значение: ');
    Readln(S);
    if S = '' then begin
      Writeln('Ввод элемента отменён.');
      Code := 0;
    end else begin
      Val(S, Data, Code);
      if Code = 0 then begin
        Push(aQueue, Data);
        Writeln('Элемент добавлен.');
        Code := 1;
      end else
        Writeln('Неверный ввод. Повторите.');
    end;
  until Code = 0;
  Writeln('Ввод элементов очереди завершён.');
end;
 
var
  Q : TQueue;
  Data : TData;
  Cmd, Code, Cnt : Integer;
  S : String;
begin
  //Начальная инициализация очереди.
  Init(Q);
 
  repeat
    //Меню
    Writeln('Выберите действие:');
    Writeln('1: Добавление элементов в очередь.');
    Writeln('2: Распечатка очереди.');
    Writeln('3: Проверка очереди на пустоту.');
    Writeln('4: Удаление элементов по условию.');
    Writeln('5: Удаление очереди (очистка).');
    Writeln('6: Выход.');
    Write('Введите команду: ');
    Readln(Cmd);
    case Cmd of
      1: WorkAdd(Q);
      2:
        if Q.PFirst = nil then
          Writeln('Очередь пуста.')
        else begin
          Writeln('Содержимое очереди (начало - конец):');
          Print(Q);
        end;
      3:
        if Q.PFirst = nil then
          Writeln('Очередь пуста.')
        else
          Writeln('Очередь не пуста.');
      4:
      begin
        Writeln('Элементы с заданным значением будут удалены из очереди.');
        repeat
          Write('Задайте значение: ');
          Readln(S);
          Val(S, Data, Code);
          if Code <> 0 then
            Writeln('Неверный ввод. Повторите.');
        until Code = 0;
        Write('Удалить элементы с заданным значением? д/н, y/n: ');
        Readln(S);
        if (S <> '') and (S[1] in ['Д', 'д', 'Y', 'y']) then begin
          Cnt := Del(Q, Data);
          Writeln('Очередь обработана. Количество удалённых элементов: ', Cnt);
        end else
          Writeln('Операция отменена.');
      end;
      5, 6:
      begin
        Free(Q);
        Writeln('Очередь удалёна из памяти (очищена).');
      end;
      else
        Writeln('Незарегистрированная команда. Повторите ввод.');
    end;
  until Cmd = 6;
 
  Writeln('Работа программы завершена. Для выхода нажмите Enter.');
  Readln;
end.
3
25.12.2012, 15:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2012, 15:42
Помогаю со студенческими работами здесь

Удаление из списка третьего элемента
Дан список А, состоящий из записей: первое поле – слово из десяти символов, второе – адрес...

Удаление первого элемента списка
Ребят помогите,пожалуйста. Суть в том,что нужно составить список(записную книжку) с фамилиями...

Удаление из списка предпредпоследенего элемента
Подскажите пожалуйста, почему когда список состоит из трех элементов срабатывает else...

Удаление из списка L одного элемента, следующего за элементом E
Имеются линейные однонаправленные списки: type p=^item; item=record data:real; reference:p...


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

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

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