1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
1

Линейные списки

08.12.2009, 11:29. Показов 2492. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуста решить задачу.
Уже неделю не могу решить! Где-то в воде нового элемена ошибка, не могу найти, пожалуста помогите найти. Всегда выводит последний вводимый элемент, а не все вводимые элементы.
Задача такая:

Разработать программу для реализации основных действий с упорядоченным динамическим списком:
•проход по списку с выводом на экран информационных частей элементов
•добавление нового элемента
•удаление заданного элемента.
Пожалуста помогите.
Заранее спасибо!!!

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
program ListEl;
type                       
 pDinItem=^TDinItem; 
 TDinItem=record 
   inf:integer; 
   next:pDinItem; 
 end;
var 
   pHead:pDinItem;
   pCurrent:pDinItem;
   selekt:integer;
procedure EmptyList(var pCurrent,pHead:pDinItem);
 begin 
  New(pHead);
  pHead^.next:=nil;
  pCurrent:=pHead;
 end; 
 
procedure AddEl(var pCurrent:pDinItem);
var
  x: integer;
  pTemp:pDinItem;
begin
  New(pTemp);
  writeln('Enter a new element');
  readln(x);
  pTemp^.next:=nil;
  pCurrent^.next:=pTemp; 
  pCurrent:=pTemp^.next;
  pCurrent^.inf:=x;
end; 
procedure Lead(var pCurrent:pDinItem); 
begin
  while pCurrent<>nil do
  pCurrent:=pCurrent^.next; 
  writeln(pCurrent^.inf);end;
 
procedure PutEl(var pCurrent:pDinItem);
 var
   pPrev:pDinItem;
   x:integer;
begin 
   Writeln('Enter a deleted element');
   readln(x); 
   While (pCurrent<>nil) and (pCurrent^.inf<>x) do
   pCurrent:=pCurrent^.next; 
   if pCurrent=nil then  
   Writeln('The element is not present') else
  begin 
   pPrev^.next:=pCurrent^.next;
   dispose(pCurrent); 
   pCurrent:=pPrev; 
  end; 
end;
 
begin
 EmptyList(pCurrent,pHead); 
 repeat  
  writeln;  
  writeln(':USER MENU:'); 
  writeln('1:Add');
  writeln('2:Put');
  writeln('3:lead');
  readln(selekt); 
 case selekt of 
  1: AddEl(pCurrent);
  2: PutEl(pCurrent);
  3: lead(pCurrent);
 end;
  until selekt=0;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2009, 11:29
Ответы с готовыми решениями:

Линейные списки и циклические списки
Подскажите,кто как может,у меня тут 2 лабы,с чего мне начать,где можно материал взять?? 1-ая...

линейные списки
помогите пожалуйста срочно с написанием программы по линейным спискам: Создать список Р, что...

Линейные списки
Помогите пожалуйста в решении задачи! 1.Используйте линейные списки для хранения...

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

15
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
08.12.2009, 12:26 2
при вводе не знаю, EmptyList несколько странно написан, при выводе точно -
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure Lead(var pCurrent:pDinItem); 
begin
  while pCurrent<>nil do
  pCurrent:=pCurrent^.next; 
  writeln(pCurrent^.inf);end;   
- не хватает begin -end для цикла! и еще - что такое pCurrent - указатель на 1 элемент или на последний? 
 если есть указатель на первый эл-т, то написала бы так
 
procedure Lead(pFirst:pDinItem); 
var pCurr: pDinItem; 
begin
  pCurr := pFirst; 
  while pCurr<>nil do
  BEGIN 
    writeln(pCurr^.inf);
    pCurr:=pCurr^.next; 
  END;
end;
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
08.12.2009, 14:12  [ТС] 3
Цитата Сообщение от Dnnn Посмотреть сообщение
при вводе не знаю, EmptyList несколько странно написан, при выводе точно -
А что в процедуре EmptyList не правильно?
0
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
08.12.2009, 15:14 4
если Вы хотели просто в начале программы сделать список пустым, то хватило бы просто
pHead := nil;
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
08.12.2009, 15:26  [ТС] 5
Значит можно вообще эту процедуру не писать?
0
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
08.12.2009, 15:37 6
да напишите процедуру в одну строчку. а то некоторые преподаватели любят, чтоб все было как положено - нужно действие "инициализации списка" перед началом работы с ним - должна быть и процедура.
а если нужно написать процедуру освобождения памяти в конце работы программы - удаление всего списка -то посмотрите тут рядом была тема участника lex_corba и там у него есть такая процедура
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
08.12.2009, 18:34  [ТС] 7
Что-то у меня ничего не получается.
выводит всегда:
2835
12870
Я пока пишу без процедуры удаления, чтобы окончательно не запутаться

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
procedure EmptyList(var pHead:pDinItem);
 begin 
  New(pHead);
  pHead^.next:=nil;
 end; 
 
procedure AddEl(var pHead:pDinItem);
var
  x: integer;
  pTemp:pDinItem;
begin
  pCurrent:=pHead;
  New(pTemp);
  writeln('Enter a new element');
  readln(x);
  pTemp^.next:=nil;
  pCurrent^.next:=pTemp; 
  pCurrent:=pTemp^.next;
  pCurrent^.inf:=x;
end; 
 
procedure Lead(pHead:pDinItem); 
var pCurr: pDinItem; 
begin
 pCurr := pHead; 
 while pCurr<>nil do
 BEGIN 
  writeln(pCurr^.inf);
  pCurr:=pCurr^.next; 
 END;
end;
0
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
09.12.2009, 10:08 8
Цитата Сообщение от Krot_F Посмотреть сообщение
Что-то у меня ничего не получается.
выводит всегда:
2835
12870
Я пока пишу без процедуры удаления, чтобы окончательно не запутаться
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
procedure EmptyList(var pHead:pDinItem);
 begin 
  !!! это зачем? Вы выделяете память под вроде как первый элемент, но при этом в информационную часть ничего не записываете , а записываете только пустой указатель на следующий элемент.
  напишите просто        pHead:=nil;
 
  New(pHead);       ?????????
  pHead^.next:=nil;
 end; 
 
procedure AddEl(var pHead:pDinItem);
var
  x: integer;
  pTemp:pDinItem;
begin
  !!! добавление элемента... если первый раз добавление делаем, то что получится?
      pHead - уже не пустой указатель после предыдущей процедуры EmptyList, а указатель c пустой информац. частью или может не с пустой, а случайным образом заполненной... 
     создаем темп^, указателю на след. первого эл-та присваиваем темп pCurrent^.next:=pTemp,    
     потом вдруг  pCurrent:=pTemp^.next -получается вообще пустое значение в  pCurrent записываем, и непонятно даже, как потом должно сработать при этом   pCurrent^.inf:=x, если pCurrent = nil... 
 
  pCurrent:=pHead;  New(pTemp);
  writeln('Enter a new element'); readln(x);
  pTemp^.next:=nil; pCurrent^.next:=pTemp; pCurrent:=pTemp^.next; pCurrent^.inf:=x;
end; 
 
  предлагаю например так
procedure AddEl(var pHead:pDinItem);
var x: integer;  pTemp, pCurrent:pDinItem;
begin 
  writeln('Enter a new element'); readln(x); 
  New(pTemp); pTemp^.next:=nil; pTemp^.inf:=x; {создали новый элемент, его адрес в переменной темп}
 
  if pHead = nil then {первый элемент добавляем - надо запомнить его адрес в Head}
       pHead := pTemp  
  else  {не первый элемент добавляем}
  begin 
   pCurrent:=pHead;  
   { идем по списку до конца }
   while pCurrent^.next<>nil do 
        pCurrent := pCurrent^.next; 
  {теперь в pCurrent - указатель на посл элемент списка }
   pCurrent^.next:=pTemp; 
 end; 
end;
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
09.12.2009, 12:19  [ТС] 9
Огромное спасибо!
Не знаю как мир бы существовал без таких отзывчивых людей!!!
А из-за чего у меня когда я вывожу элементы то выводит сночало 21899, а потом все элементы.
Откуда это число выходит?
0
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
09.12.2009, 12:26 10
не знаю... а полный текст программы можно? тогда может будет ясно
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
09.12.2009, 12:37  [ТС] 11
Уменя пока без удаления.

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
program abc;
uses Crt;
type  
 pDinItem=^TDinItem;  
 TDinItem=record 
   inf:integer; 
   next:pDinItem;
 end; 
 var  
   pHead:pDinItem; 
   selekt:integer; 
procedure EmptyList(var pHead:pDinItem); 
 begin 
  New(pHead); 
  pHead^.next:=nil; 
 end; 
procedure AddEl(var pHead:pDinItem); 
var  
  x:integer;  
  pCurrent,pTemp:pDinItem; 
begin 
  writeln('Enter a new element'); 
  readln(x); 
  New(pTemp); 
  pTemp^.next:=nil; 
  pTemp^.inf:=x;  
  if pHead=nil then pHead:=pTemp
 else 
begin 
 pCurrent:=pHead;   
 While pCurrent^.next<>nil do 
      pCurrent:=pCurrent^.next; 
 pCurrent^.next:=pTemp;
 end;  
end;
procedure Lead(var pHead:pDinItem); 
  var pCurr:pDinItem;  
begin  
  pCurr:=pHead; 
  while pCurr<>nil do  
 begin
  writeln(pCurr^.inf); 
  pCurr:=pCurr^.next;  
 end;
end; 
begin
 EmptyList(pHead); 
 repeat  
  writeln;  
  writeln(':USER MENU:');  
  writeln('1:Add');  
  writeln('3:lead'); 
  readln(selekt); 
 case selekt of   
  1: AddEl(pHead);  
  3: lead(pHead);  
 end;  
  until selekt=0;  
end.
0
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
09.12.2009, 12:55 12
так вот это Вы не исправили )
procedure EmptyList(var pHeadDinItem);
begin
New(pHead); pHead^.next:=nil; - вот здесь, в 1 элементе и будет всегда записано непонятно что - или 0 или какие-то случайные числа.
end;

Pascal
1
2
3
4
procedure EmptyList(var pHead:pDinItem); 
begin 
  Head:=nil;
end;
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
09.12.2009, 13:00  [ТС] 13
Спасибо
0
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
10.12.2009, 13:58  [ТС] 14
Пожалуста помогите найти ошибку в процедуре удаления.
Удоляются почему то все элементы вместо одного вводимого элемента.


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure PutEl(var pHead:pDinItem);
var   
  x:integer;   
  pPrev,pCurrent:pDinItem;
begin  
  writeln('Enter a deleted element');  
  readln(x);   
  pCurrent:=pHead;  
  While(pCurrent<>nil) and (pCurrent^.inf<>x) do  
  pCurrent:=pCurrent^.next;  
  if pCurrent=nil then writeln('The element is not present')    
 else begin   
  pPrev^.next:=pCurrent^.next;    
  dispose(pCurrent);   
  end;  
end;
0
1063 / 130 / 34
Регистрация: 09.10.2009
Сообщений: 271
10.12.2009, 15:51 15
у Вас указатель на предыдущий удаляемому элемент не определен. так что видимо просто связи на удаляемом элементе прерываются. попробуйте так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure PutEl(var pHead:pDinItem);
var   
  x:integer;   
  pPrev,pCurrent:pDinItem;
begin  
  writeln('Enter a deleted element');  
  readln(x);   
  pCurrent:=pHead;  
  pPrev := nil; {Указатель на предыдущий элемент }
  While(pCurrent<>nil) and (pCurrent^.inf<>x) do  
  BEGIN pPrev := pCurrent; 
           pCurrent:=pCurrent^.next;  
  END;
  if pCurrent=nil then writeln('The element is not found')    
  else begin   
           if pPrev = nil then {если удаляем 1 элемент - надо переопределить указатель на нач. списка!}
                 pHead := pCurrent^.next 
           else {не первый эл-т удаляем }
                 pPrev^.next:=pCurrent^.next;    
           dispose(pCurrent);   
  end;  
end;
1
1 / 1 / 1
Регистрация: 07.12.2009
Сообщений: 99
10.12.2009, 16:06  [ТС] 16
Большое "СПАСИБО"
0
10.12.2009, 16:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2009, 16:06
Помогаю со студенческими работами здесь

ДСД. Линейные списки
Attention! Даны два целочисленных списка L1 и L2. Построить новый список L3, включив в него...

Линейные 1направленные списки.
Вставка в нач. и конец списка, просмотр, поиск и удаление. Помогите поправить код программы....

Линейные связанные списки
Составить программу обработки списка. Вид списка: линейный дважды связанный. Тело программы должно...

Имеются линейные однонаправленные списки
Имеются линейные однонаправленные списки: type p=^item; item=record ...


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

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

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