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

Динамический список. Удаление

05.11.2014, 08:21. Показов 1532. Ответов 8
Метки нет (Все метки)

Добрый день! Вопрос по удалению, т.к. не был найден ответ в похожих темах. Используется два модуля. Первый - класс элементов списка. Второй - дин.список. Реализацию добавления сделала, вопрос с удалением указанного элемента из списка. Требования: "метод удаления принято делать по следующей схеме: проверить список на пустоту, потом проверить удаление первого элемента, а уж затем запускать поиск удаляемого элемента с проверкой результата и изменением связей". Что я делаю не так?
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
type
  TDoctor = class
  private
    Name: string;
    Oklad: integer;
    Next: TDoctor;
  public
    constructor Create(aName: string; aNext: TDoctor; aOklad: integer);
    destructor Destroy;
    procedure SetName(aName: string);
    procedure SetOklad(aOklad: integer);
    procedure SetNext(aDoctor: TDoctor);
    function GetName: string;
    function GetOklad: integer;
    function GetNext: TDoctor;
  end;
 
type
  TDep = class
  private
    Name : string;
    FirstDoctor: TDoctor;
    Count: integer;
  public
    constructor Create(aName: string);
    procedure SetName(aName: string);
    function GetName: string;
    function GetFirstDoctor(): TDoctor;
    function DeleteDoctor(aName: string): boolean;
    procedure AddFirst(aDoctor: TDoctor);
    function AddAfter(aDoctor: TDoctor; After_Name:String): Boolean;
    function Find(aName: string): TDoctor;
  end;
 
function TDep.Find(aName: string): TDoctor;
var
  n:TDoctor;
begin
  n:=FirstDoctor;
  while (n<>nil) do
  if (n.GetName=aName) then
  begin
    Result:=n;
    break;
  end
  else
  n:=n.GetNext;
  Result:=nil;
end;
 
function TDep.DeleteDoctor(aName: string): boolean;
var
  d1, d2: TDoctor;
begin
  Result:=False;
  if Count <> 0 then // проверка на пустой список
  begin
    if FirstDoctor.GetName = aName then  // если удаляется первый элемент
    FirstDoctor:=FirstDoctor.GetNext;
    else
      if Find(aName)=nil then
      Exit
      else
      d1:=Find(aName);
      d1:=d1.GetNext;
  end;
  Count:=-Count;
end;
Прошу вашей помощи! Или совета, т.к. литературы очень мало по структурам данных и они в основном описывают Record'ы, а как быть с классами, если честно, не могу разобраться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2014, 08:21
Ответы с готовыми решениями:

Динамический однонаправленный список. Удаление элементов из списка.
входные данные : 3 ---количество студентов Ivan Roman Yura Yura ...

Удаление. Динамический список
Не как не выходит написать код... Требуется процедура удаления по ФИО, т.е мы пишем ФИО, удаляется...

Отсортировать динамический список, используя основной (заполненный) и второй пустой список
Вроде бы сделал, но почему-то пропадает первый элемент... Иногда последний, не могу отследить... Не...

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

8
61 / 51 / 25
Регистрация: 17.12.2013
Сообщений: 234
05.11.2014, 08:49 2
ИМХО, вы изобретаете велосипед. При том не универсальный, а узконаправленный специально для вашего проекта.
Для динамических коллекций объектов есть специальный класс TObjectList.
Вот описание
Попробуйте использовать его и увидите на сколько станет проще жить =)
1
2649 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,725
05.11.2014, 08:54 3
Цитата Сообщение от Olesta Посмотреть сообщение
проверить удаление первого элемента
Чушь какая-то ..

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Olesta Посмотреть сообщение
они в основном описывают Record'ы, а как быть с классами
Классы по своей сути есть ничто иное как record'ы

0
61 / 51 / 25
Регистрация: 17.12.2013
Сообщений: 234
05.11.2014, 09:08 4
Интересное решение, каждый элемент ссылается на следующий, а если я его удалю не штатным (описанным вами) методом а с помощью FreeMem, то весь ваш список полетит к чертям. Попробуйте все-таки обратиться к TObjectList.
0
157 / 300 / 47
Регистрация: 14.08.2012
Сообщений: 2,578
05.11.2014, 10:32 5
Удалить элемент в любом списке можно так:
1. Если в списке нечего нет или номер удаляемого элемента больше номера последнего элемента, то показываем сообщение об ошибке и выходим.
2. Удаляем этот элемент(Указатели в nil, Числа в 0, Строки в '').
3. Двигаем весь список, после удаляемого элемента на 1 ближе к началу.
ВСЁ!
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 12
23.11.2014, 23:42  [ТС] 6
Нужна помощь... 3 раза уже пыталась сдать преподу, там и не получилось.... Кто-нибудь может помочь????
0
61 / 51 / 25
Регистрация: 17.12.2013
Сообщений: 234
24.11.2014, 07:38 7
Цитата Сообщение от KMSNasgool Посмотреть сообщение
Попробуйте все-таки обратиться к TObjectList.
Пробовали? Если да, то какие проблемы с ним возникли?
ЗЫ ваш бредовый код править не стану
0
1177 / 419 / 106
Регистрация: 31.03.2012
Сообщений: 1,138
25.11.2014, 07:50 8
Может не совсем то, что нужно. Здесь консольное приложение. Пару функций поленился дописать . Но добавление, удаление и последовательное извлечение реализовано.
Вложения
Тип файла: 7z cf013.7z (2.3 Кб, 3 просмотров)
0
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 12
08.01.2015, 14:19  [ТС] 9
Преподаватель против полного изменения кода. Сказал, раз так начали, то доведите до конца свои начинания... Три месяца бьюсь, а все не так... Подскажите, что не так по его замечаниям, пожалуйста.

Класс Отделение:
- метод FindPrev: а будет ли в цикле меняться указатель temp?
- метод удаления: неправильно оформлена ветка else

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
function TDep.Find(aName: string): TDoctor;
var
  n:TDoctor;
begin
  n:=FirstDoctor;
  while (n<>nil) do
  if (n.GetName=aName) then
  begin
    Result:=n;
    break;
  end
  else
  n:=n.GetNext;
  Result:=nil;
end;
 
function TDep.FindPrev(aName: string): TDoctor;
var
  temp, prev:TDoctor;
begin
  Result:=nil;
  prev:=nil;
  temp:=FirstDoctor;
  while (temp<>nil) do
  if (temp.GetName=aName) then
  begin
    Result := prev;
    Exit;
  end
  else
  prev := temp;
  temp:= prev.GetNext;
end;
 
function TDep.DeleteDoctor(aName: string): boolean;
var
  temp, prev: TDoctor;
begin
  Result := false;
  if FirstDoctor = nil then // список пуст
    begin
      Exit;
    end;
  if Find(aName)=nil then // нужный элемент не найден
    begin
      Exit;
    end;
  if FirstDoctor.GetName = aName then // удаление первого элемента
    begin
      FirstDoctor := FirstDoctor.GetNext;
      Dec(Count);
      Result := True;
      Exit;
    end
  else
    prev := FindPrev(aName);
    temp:=prev.GetNext;
    prev.SetNext(temp.GetNext);
    Dec(Count);
    temp.Free;
    Result:=True;
end;
Класс Поликлиника: в методе загрузки появились синтаксические ошибки:
- неправильно оформлены блоки операторов
- в вызовах методов нарушено соответствие фактических значений и формальных параметров

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
function TPoliclinica.LoadFromFile(fileName: string): Boolean;
var
  F: TextFile;
  i, j, Count1: integer;
  NameDoc, S: string;
  oklad: Integer;
  NameDep: string;
  CountDoc: Integer;
  Doct: TDoctor;
begin
  if FileExists(fileName) then
  begin
    Assign(F, fileName);
    Reset(F);
    Readln(F); // номер поликлиники
    Readln(F, S);
    Number:= StrToInt(S);
    SetNumber(Number);
    Readln(F); // отделений
    Readln(F, S);
    Count1:=StrToInt(S);
    for i=1 to Count1 do
    begin
      Readln(F); // название отделения
      Readln(F, NameDep);
      Department[i]:=TDep.Create(NameDep);
      Readln(F); // докторов
      Readln(F, S);
      CountDoc := StrToInt(S);
      for j=1 to CountDoc do
      begin
        Readln(F, NameDoc);
        Readln(F, oklad);
        Doct:=nil;
        if Department[i].GetFirstDoctor=nil then
        Department[i].AddFirst(Doct.Create(NameDoc, nil, oklad));
        Doct:=Department[i].GetFirstDoctor
        else
        Department[i].AddAfter(Doct.Create(NameDoc, Doct, oklad));
        Doct:=Doct.GetNext;
      end;
    Close(F);
    Result:=True;
    end
    else
    Result:=False;
end;
Форум-гуру, сделайте, пожалуйста, Новогодний подарок юному программеру...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2015, 14:19
Помогаю со студенческими работами здесь

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

Динамический список
Привет всем! Проблема такая: в динамическом списке ввожу 1 строку, а затем 2ю и все элементы в 1...

Динамический список
Здравствуйте. получил задание создать динамический список и методы работы со списком создать...

динамический список
вот начал разбираться с динамическими списками, объясните что на так делаю. спасибо #include...


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

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

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