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

Динамический однонаправленный список. Удаление элементов из списка.

24.03.2012, 03:32. Показов 4975. Ответов 2
Метки нет (Все метки)

входные данные :
3 ---количество студентов
Ivan
Roman
Yura
Yura --- студент,которого нужно найти в списке и удалить

в результате должно вывести:
Ivan
Roman

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
program single;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
type
  PNode = ^TNode;
  TNode = record
    data : string;
    next : PNode;
  end;
  TList = PNode;
 
var
  list : TList;
  namefind : string;
  i : integer;
  p : PNode;
 
procedure createlist(var l : TList);
begin
  l := nil;
end;
 
procedure addtolist(var l : TList; d : string);
var
  p : PNode;
begin
  new(p);
  p^.data := d;
  p^.next := l;
  l := p;
end;
 
procedure readlist(var l : TList);
var
  k : integer;
  d : string;
  i : integer;
begin
  readln(k);
  for i := 1 to k do
  begin
    readln(d);
    addtolist(l, d);
  end;
end;
 
 
function find(l : TList; d: string): PNode;
begin
     ???????????
end;
 
procedure delete(var p: PNode);
begin
???????
end;
 
 
procedure writelist(var l: Tlist);
var
  p : PNode;
begin
  p := l;
  while p <> nil do
    begin
      writeln(p^.data);
      p := p^.next;
    end;
 
end;
 
begin
createlist(list);
 
readlist(list);
readln(namefind);
 
p := find(list , namefind);
if p = nil then
  writeln('It doesn"t exist')
  else
  begin
    writeln('It exists');
    delete(p);
  end;
 
writelist(list);
 
readln;
end.
 Комментарий модератора 
Тема перенесена в раздел: Делфи для начинающих. Исходный раздел: Форум Pascal (Паскаль).
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2012, 03:32
Ответы с готовыми решениями:

Динамический однонаправленный список
Доброго времени суток. Делаю список, и нужно удалить звено в списке. Посмотрел много примеров, да и...

Однонаправленный список. Удаление
У меня вопрос. Есть однонаправленный (динамический) список. Как сделать так, чтобы по нажатию...

Список: Удаление всех подряд идущих одинаковых элементов из списка
Помогите пожалуйста реализовать процедуру удаления всех подряд идущих одинаковых элементов из...

Динамический список. Удаление
Добрый день! Вопрос по удалению, т.к. не был найден ответ в похожих темах. Используется два модуля....

2
13090 / 5871 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
25.03.2012, 05:00 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
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
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Windows;
 
type
  //Тип указателя на элемент списка.
  TPElem = ^TElem;
  //Тип элемента списка.
  TElem = record
    Data : String;
    PNext : TPElem; //Указатель на следующий элемент списка.
  end;
  //Тип, описывающий однонаправленный список.
  TList = record
    PFirst : TPElem; //Указатель на первый элемент списка.
    PLast : TPElem; //Указатель на последний элемент списка.
  end;
 
//Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
//только в отношении пустого списка! Иначе - будут утечки памяти.
procedure Init(var aList : TList);
begin
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
//Добавление элемента в конец однонаправленного списка.
procedure AddL(var aList : TList; const 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;
 
(*
Исключение элемента из однонаправленного списка по указателю
на предыдущий элемент.
Функция возвращает указатель на элемент, который исключён из списка.
Если указатель на предыдущий элемент равен NIL, то исключается первый
элемент списка.
Эта функция только исключает элемент из списка. Если, кроме этого
требуется удалить элемент из памяти, тогда надо выполнить вызов
Dispose() за пределами процедуры.*)
function Del(var aList : TList; var aPPrev : TPElem) : TPElem;
begin
  Result := nil;
  if aList.PFirst = nil then Exit;
 
  if aPPrev = nil then begin
    Result := aList.PFirst;
    aList.PFirst := Result^.PNext;
  end else begin
    Result := aPPrev^.PNext;
    if Result <> nil then aPPrev^.PNext := Result^.PNext;
  end;
  if aList.PLast = Result then aList.PLast := aPPrev;
end;
 
//Удаление однонаправленного списка из памяти и инициализация.
procedure ListFree(var aList : TList);
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 ListPrint(const aList : TList);
var
  PElem : TPElem;
  i : Integer;
begin
  if aList.PFirst = nil then begin
    Writeln('Список пуст.');
    Exit;
  end;
 
  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;
 
var
  L : TList;
  PElem, PPrev, PDel : TPElem;
  i : Integer;
  S : String;
begin
  //Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
  //Если после переключения русские буквы показываются неверно,
  //следует открыть системное меню консольного окна - щелчком мыши в левом
  //верхнем углу окна консоли и выбрать:
  //Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
 
  //Начальная инициализация списка.
  Init(L);
 
  repeat
    //Создание списока.
    Writeln('Создание списка.');
    Writeln('Прекратить ввод - пустая строка + Enter.');
    i := 0;
    repeat
      Write('Элемент ', i + 1, ': ');
      Readln(S);
      if S = '' then Continue;
      Inc(i);
      New(PElem);
      PElem^.Data := S;
      AddL(L, PElem);
    until S = '';
    Writeln('Составлен список:');
    ListPrint(L);
 
    Writeln('Задайте имя, которое следует удалить из списка:');
    Readln(S);
    //Удаляем из списка все элементы с заданным текстом.
    PPrev := nil; //Указатель на предыдущий элемент.
    PElem := L.PFirst; //Указатель на текущий элемент.
    while PElem <> nil do begin
      if PElem^.Data = S then begin //Удаление элемента и переход к следующему.
        PDel := Del(L, PPrev);
        PElem := PDel^.PNext;
        Dispose(PDel);
      end else begin //Переход к следующему элементу.
        PPrev := PElem;
        PElem := PElem^.PNext;
      end;
    end;
 
    Writeln('Cписок после удаления:');
    ListPrint(L);
 
    //Удаление списка из памяти.
    ListFree(L);
    Writeln('Список удалён из памяти. Работа завершена.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
1
4299 / 1421 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
25.03.2012, 13:03 3
Вот чуть попроще:
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
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
type
Link = ^Number;
Number = record
 ID: integer;
 Cislo : string;
 NextRec: Link;
end;
var i, c, j: integer;
    a: string;
    Last, First, Curr, spisok, tmp : Link;
 
procedure Add(var spis1:Link ;znach1: string);
var
  tmp:Link;
begin
  if spis1=nil then {Проверяем не пуст ли список, если пуст, то }
  begin
    GetMem(spis1,sizeof(number));  {создаём его первый элемент}
    tmp:=spis1;
  end
  else {в случае если список не пуст}
  begin
    tmp:=spis1;
    while tmp^.nextrec<>nil do
      tmp:=tmp^.nextrec; {ставим tmp на последний элемент списка}
    GetMem(tmp^.nextrec,sizeof(number)); {создаём следующий элемент}
    tmp:=tmp^.nextrec;   {переносим tmp на новый элемент}
  end;
  tmp^.nextrec:=nil; {зануляем указатель}
  tmp^.cislo:=znach1; {заносим значение}
end;
 
procedure del(var first:link);
var kur: link;
begin
 kur:=first;
 first:=first^.nextrec;
 dispose(kur);
end;
 
procedure ShowList(first: link);
begin
 Writeln('Spisok elementov:');
 if first=nil then writeln('V spiske net elementov')
 else
  begin
   while first<>nil do
    begin
     writeln(first^.cislo);
     first:=first^.nextrec;
    end;
 end;
end;
 
begin
 Write('Ukazhite dlinu spiska: ');
 Readln(c);
 first:=nil;
 Writeln('Vvedite imena lyudey:');
 for i := 1 to c do
 begin
  readln(a);
  add(first,a);
 end;
 Writeln('Ukazhite # cheloveka dlya udaleniya: ');
 readln(j);
 Curr := First;
 for i := 1 to j - 2 do Curr := Curr^.NextRec;
  if (j > c) or (j<=0) then
   writeln('Нету такого №.')
  else
   if j = 1 then
    First := First^.NextRec
   else
    if j =c then
     begin
      Curr^.NextRec := Nil;
      Last := Curr^.NextRec;
     end
    else
     Curr^.NextRec := Curr^.NextRec^.NextRec;
  ShowList(first);
readln;
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2012, 13:03
Помогаю со студенческими работами здесь

Однонаправленный список. Вывод элементов, списка. Удаление списка.
Создать однонаправленный список натуральных чисел. Найти и вывести элементы списка, кратные 3....

Линейный однонаправленный список. Удаление элементов
Создать линейный однонаправленный список. Удалить из него все символы 'p' перед символом 'a'....

Реализуйте однонаправленный список.Режим сортировки элементов списка без перестановки самих элементов
Реализуйте задание .В каждом из вариантов должно быть реализованы следующие режимы работы:...

Однонаправленный список из квадратов отрицательных элементов первого списка
Создать однонаправленный список действительных чисел, который может содержать как положительные так...


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

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

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