IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> удаление, Сортированный список
сообщение
Сообщение #1


Гость






Не получается сделать удаление из списка
Должно быть удаление из середины списка, а не только из начала

Код

program sortspisok;
uses crt;
type
    p_sort=^sspis;
    sspis=record
    nomer:string[20];
    next:p_sort;
    end;
var
    head:p_sort; {указатель на первый элемент списка}
    cur:p_sort; {текущий элемент списка}
    p:p_sort; {элемент, после которого вставляем новый узел}
    del:p_sort;
    nomer:string[20]; {элемент ввод с клавиатуры}
    node: p_sort; {новый узел списка}
    c: char;
    f: string;
    n: byte;
begin
    repeat
    clrscr;
    writeln ('сортированный список');
    writeln ('');
    writeln (' a - добавить элемент');
    writeln (' d - удалить элемент');
    writeln (' f - найти');
    writeln (' e - выйти');
    writeln;
    writeln ('======');
    if head = nil
    then writeln ('<>')
    else begin
           cur := head;
           repeat
           writeln (cur^.nomer);
           cur:=cur^.next;
           until cur = nil;
         end;
    writeln ('======');
    c := readkey;
{выход}
    if c = 'e' then exit;
{удаление}
   if c = 'd' then
   if not (head = nil) then
     begin
       write ('удаление элемента : ');
       readln (f);
       cur := head;
       del := nil;
       repeat
       if (cur^.nomer = f) then
         begin

          del :=cur^.next;
         cur^:=del^;
         del^.next:=nil;
{          dispose (del);}
{          del:=NIL;}
         end;
{         cur^.next := cur^.next^.next;}

{          keypressed;}           until cur<>nil;

     end;


{поиск}
    if c = 'f' then
    begin
      write ('найти элемент : ');
      readln (f);
      cur := head;
      n := 0;
      repeat
      if cur^.nomer = f
      then writeln ('..элемент №', n, ' = ', f);
      cur := cur^.next;
      inc (n);
      until cur = nil;
      repeat until keypressed; end;
{добавление }
     if c = 'a' then
     begin
       write('элемент ');
       readln(nomer);
       if length (nomer)<>0 then begin
{введена строка символов}
       new(node); {создадим новый элемент списка}
       node^.nomer:=nomer;
       node^.next:=NIL;
{ищем место для вставки нового элемента}
       cur:=head;
       p:=NIL;
{будем сравнивать введенное значение со значением текущего узла}
       while(nomer>cur^.nomer) and (cur<>NIL) do
       begin
{введенное значение больше текущего}
         p:=cur;
         cur:=cur^.next; {к следующему узлу}
       end;
       if p = NIL then
       begin
{узел в начало списка}
         node^.next:=head;
         head:=node;
       end
       else
       begin
         node^.next:=p^.next;
         p^.next:=node;
       end;
  end;
end;
    until length(nomer)=0; { элемент не введен, нажата клавиша < Enter > }
{ распечатаем введенный список }
    cur:=head;
{ writeln('Сортированный  список ');
    while cur<>NIL do begin
         writeln(cur^.nomer);
         cur:=cur^.next;   end;}
    readln;
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Не получается сделать удаление из списка

Замени свой кусок (обработку 'd') на вот это:
if c = 'd' then

if not (head = nil) then begin
write ('удаление элемента: '); readln (f);

if head^.nomer = f then begin
cur := head^.next;
dispose(head);
head := cur;
end
else begin

cur := head;
repeat

if (cur^.next^.nomer = f) then begin
del :=cur^.next;
cur^.next := del^.next;
dispose(del);
del := nil
end
else cur := cur^.next;

until (cur^.next = nil);

end; { else }
end; { if not (head=nil) }

Это первое.

Второе: при добавлении элемента у тебя программа валится (Segmentation Fault). Ошибка здесь:
{ будем сравнивать введенное значение со значением текущего узла }
while(nomer>cur^.nomer) and (cur<>NIL) do ... { <--- Здесь !!! }

Поменяй порядок выполнения условий:
while(cur <> nil) and (nomer>cur^.nomer) do ...

и все будет работать (при невыполнении первого условия второе даже не будет проверяться)

P.S. А вообще, пересмотри структуру программы. Каждое действие: добавление/удаление/поиск вынеси в отдельную процедуру/функцию. Программа сразу станет намного более простой и читабельной, а что самое главное, полученные подпрограммы ты сможешь еще раз использовать в дальнейшем, чтобы не изобретать велосипед заново...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Спасибо за помощь
всё оказалось проще, чем мне казалось
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.05.2024 7:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name