С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 10.01.2012
Сообщений: 5
1

Проблема с указателями

16.04.2012, 19:05. Показов 964. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток!!! Учебная задачка, но я себе всю голову сломал с этими указателями... ну вообщем задачка в том чтобы из списка (который записан в файле) удалить первые значения = 0. вот код. вся проблема в функции DeleteFirst не пойму как она должна работать. заранее благодарю!!!

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
program LW1;
{$APPTYPE CONSOLE}
uses     SysUtils;
type
    tValue=Integer;                 // тип содержательной части элемента списка - це-лый
    pItem=^tItem;                       // тип указателя на элемент списка
    tItem=record                        // тип элемента списка
        Value: tValue;              // содержательная часть элемента списка
        Next : pItem;                   // указатель на следующий элемент списка
    end;        // record tItem
procedure Create(var List: pItem);  // Создание пустого списка List 
begin
    List:=nil;
end;    //procedure Create
procedure InsertFirst(var List: pItem; v: tValue);
// Включение элемента со значением v в начало списка List
var NewItem: pItem;         // указатель на новый элемент списка
begin
    New(NewItem);                   // выделение памяти под новый элемент списка
    NewItem^.Value:=v;      // запись v в поле Value нового элемента
    NewItem^.Next:=List;        // новый элемент ссылается на первый
    List:=NewItem;                  // новый элемент становится первым
end;    // procedure InsertFirst
procedure InsertLast(var List: pItem; v: tValue);
// Включение элемента со значением v в конец списка List
var NewItem, LastItem:pItem;        // указатели на новый и последний элементы
begin
    New(NewItem);                       // выделение памяти под новый элемент списка
    NewItem^.Value:=v;          // запись значения v в поле Value нового элемента
    NewItem^.Next:=nil;         // новый элемент становится последним в списке
    if List=nil                                 // если список пуст,
    then List:=NewItem              // то новый элемент становится первым в списке
    else begin                              // список не пуст - поиск последнего элемента:
        LastItem:=List;                 // устанавливаем LastItem на начало списка,
        while LastItem^.Next<>nil do begin  // пока не достигнут конец списка,
            LastItem:=LastItem^.Next;                   // сдвигаем LastItem на следующий эле-мент
        end;
        LastItem^.Next:=NewItem;                        // новый элемент следует за последним
    end;
end;    // procedure InsertLast
procedure WriteList(var f: Text; List: pItem);  // Вывод в файл f элементов списка List
var Item:pItem;                                                             // указатель на элемент списка
begin
    Item:=List;                                                                 // устанавливаем Item на начало спи-ска
    while Item<>nil do begin                                    // пока не достигнут конец списка:
        Write(f, Item^.Value:5); Item:=Item^.Next;  // вывод элемента и сдвиг Item
    end;
    Writeln(f);
end;        // procedure WriteList
function Size(List: pItem): Word;
// Возвращение числа элементов списка
var Item:pItem;                                         // указатель на элемент списка
begin
    Item:=List;                                             // устанавливаем Item на начало списка
    Result:=0;                                              // обнуляем счетчик числа элементов
    while Item<>nil do begin                // пока не достигнут конец списка:
        Item:=Item^.Next; Inc(Result);  // сдвигаем Item и увеличиваем счетчик
    end;        // while
end;
procedure Clear(var List: pItem);
// Удаление элементов списка
var Item: pItem;                                        // указатель на удаляемый элемент списка
begin
    while List<>nil do begin        // пока список не пуст:
        Item:=List;                             // устанавливаем Item на начало списка,
        List:=List^.Next;                   // передвигаем начало списка на следующий элемент
        Dispose(Item);                      // и удаляем элемент
    end;        // while
end;        //procedure Clear
function FirstValue(L:pItem):tValue;
// Возвращение значения первого элемента списка L
begin
  if L<>nil   // если список не пуст
  then Result:=L^.Value // возвращает первое значение
  else begin            // если список пуст
    Writeln('Список пуст. Для продолжения нажмите ENTER'); // выводит сообщение
    Readln;
    Halt;
  end;
end;
function DeleteFirst(L:pItem):pItem;
// Исключение первого элемента списка L и возвращение его значения
var DisItem: tValue;
begin
repeat
DisItem:=FirstValue(L);
    if DisItem=0                                            // если список пуст, то  удаление невозможно
    then begin
 
 
 
 
 
    end;
  until (DisItem<>0) or(L=nil);  //
  end;
 
var
    fDat1, fDat2, fDat3, fRes:Text;                 // файлы с исходными данными и результатами рабо-ты
    L1, L2, L3:pItem;                   // указатели на исходный и результирующие списки
    v: tValue;                              // значение элемента списка
begin
    Assign(fDat1,'LW3Dat1.txt'); Reset(fDat1);                          // открытие файла для чте-ния
  Assign(fDat2,'LW3Dat2.txt'); Reset(fDat2);                            // открытие файла для чте-ния
  Assign(fDat3,'LW3Dat3.txt'); Reset(fDat3);                            // открытие файла для чте-ния
    Assign(fRes,'LW3Res.txt'); Rewrite(fRes);                   // открытие файла для запи-си
    Create(L1); Create(L2); Create(L3);                                 // создание пустых списков
    while not EOF(fDat1) do begin // пока не достигнут конец файла fDat1:
        Read(fDat1, v);                     // чтение из файла очередного значения в v,
        InsertFirst(L1, v);             // вставка элемента со значением v в начало спи-ска L1
    end;    // while
  while not EOF(fDat2) do begin // пока не достигнут конец файла fDat2:
        Read(fDat2, v);                     // чтение из файла очередного значения в v,
        InsertFirst(L2, v);             // вставка элемента со значением v в начало спи-ска L2
    end;    // while
  while not EOF(fDat3) do begin // пока не достигнут конец файла fDat3:
        Read(fDat3, v);                     // чтение из файла очередного значения в v,
        InsertFirst(L3, v);             // вставка элемента со значением v в начало спи-ска L3
    end;    // while
 L1:=DeleteFirst(L1);
    Writeln(fRes, 'Исходный список:'); WriteList(fRes, L1);   // вывод списка L1
                                     WriteList(fRes, L2);   // вывод списка L2
                                     WriteList(fRes, L3);   // вывод списка L3
    Writeln(fRes, 'Число элементов списка: ', Size(L1));        // вывод размера L1
  Writeln(fRes, 'Число элементов списка: ', Size(L2));      // вывод размера L2
  Writeln(fRes, 'Число элементов списка: ', Size(L3));      // вывод размера L3
 
 //Clear(L1);Clear(L2);Clear(L3);                                               // удаление списков
// Close(fDat1);Close(fDat2);Close(fDat3);Close(fRes);                                                      // закрытие файлов
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2012, 19:05
Ответы с готовыми решениями:

Работа с указателями
Здравствуйте! Помогите пожалуйста,не могу разобраться с указателями. Как сделать так,что бы при в...

запутался с указателями
Ребят, подскажите, пожалуйста... два года уже не программировал в делфе и всё забыл напрочь! :( В...

Работа с указателями
Есть объект (студент) с полями, в которых расположены имя и оценки. Создан объект(база данных) с...

работа с указателями Pchar
имеется код type pstr = ^UnicodeString; var Form1: TForm1; k1:pointer; ...

4
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
16.04.2012, 21:56 2
Цитата Сообщение от renzo111 Посмотреть сообщение
вся проблема в функции DeleteFirst не пойму как она должна работать.
Её код будет таким:
Delphi
1
2
3
4
5
6
function DeleteFirst(var L : pItem) : pItem;
begin
  Result := L;
  if L = nil then Exit;
  L := L^.Next;
end;
0
0 / 0 / 0
Регистрация: 10.01.2012
Сообщений: 5
16.04.2012, 22:41  [ТС] 3
я так и не понял как значения = 0 будут удаляться из списка. если я ошибаюсь можно добавит комментарии в код. а в данном коде я насколько понял возвращаются первые же значения пока не дойдет до конца и затем переход на след запись.
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
16.04.2012, 23:16 4
Тот код, который я написал - он только для удаления первого элемента из списка. Если нужно удалить первый элемент только в том случае, если его основные данные равны нулю, тогда можно сделать так:
Delphi
1
2
3
4
5
6
7
function DeleteFirst(var L : pItem) : pItem;
begin
  Result := nil;
  if (L = nil) or (L^.Value <> 0) then Exit;
  Result := L;
  L := L^.Next;
end;
Соответственно, код для удаления всех элементов в начале списка, в которых основные данные равны нулю, будет выглядеть так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
var
  p, L : pItem;
begin
...
  p := DeleteFirst(L);
  while p <> nil do begin
    Dispose(p);
    p := DeleteFirst(L);
  end;
...
end;
1
0 / 0 / 0
Регистрация: 10.01.2012
Сообщений: 5
21.04.2012, 01:13  [ТС] 5
спасибо огромное за помощь, Mawrat! тема закрыта!
0
21.04.2012, 01:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2012, 01:13
Помогаю со студенческими работами здесь

Работа с указателями и списком
Задание: Сформировать список L4, состоящий из элементов, входящих одновременно в каждый из списков...

делфи 7 на массив с указателями
данн массив состоящий из символов определить симметричен ли он- читается ли одинаково справа-налево...

Работа с указателями. Упорядочный список.
Срочно , плиз!! Помогите дописать Упорядочный список используя указатели

Delphi. Как пользоваться указателями в моем случае
Здравствуйте, Сайберфорумчане. Давно луркаю ваш сайт, но никак не приходилось зарегистрироваться. ...


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

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