Работа со списком очень похожа на работу с очередью. Ты на листке бумаги нарисуй нужную тебе структуру, и попробуй разобраться, как она выглядит, и как направлены связи от одного элемента к другому. И что происходит при добавлении/удалении элемента. И как сделать, чтобы выполнялось нужное тебе задание (пропускались бы дубликаты элементов)... А потом посмотришь на реализацию (я сделал для типа Char, на целочисленный список поменяешь сам). А если будешь каждый раз только спрашивать, "как это да как то" и искать книги, в которых все разжевано и решено, и осталось скопировать и сдать, то сам не научишься ничему и никогда.
| Код | type T = char; link = ^item; item = record data: T; next: link; end; list = record head, tail: link end;
procedure initList(var L: list); begin L.head := nil; L.tail := nil; end; procedure deleteList(var L: list); var p: link; begin while L.head <> nil do begin p := L.head; L.head := L.head^.next; dispose(p); end; L.tail := nil; end;
procedure appendList(var L: list; value: T); var p: link; begin new(p); p^.next := nil; p^.data := value;
if L.head = nil then L.head := p else L.tail^.next := p;
L.tail := p; end;
procedure uniqueList(var L: list); var p, pp, pT: link; begin p := L.head; while p <> nil do begin pp := p^.next; while (pp <> nil) and (pp^.data = p^.data) do begin pT := pp; pp := pp^.next; dispose(pT); end; p^.next := pp;
if p^.next <> nil then L.tail := p^.next; p := p^.next; end; end;
procedure printList(var L: list); var p: link; begin p := L.head; while p <> nil do begin write(p^.data:2); p := p^.next end; writeln; end;
const s: string = 'aaabcbaaaaabbbbbbcdd'; var i: integer; L: list;
begin initList(L); for i := 1 to length(s) do appendList(L, s[i]); printList(L);
uniqueList(L); printList(L); deleteList(L); end. |
|