Есть текстовый файл, который содержит имена детей и их желание на НГ. Выглядет это так : Christoph: Schlitten Barbara: Barbie-Puppe Barbara: Puppenkьche Christoph: Matchboxauto Barabara: Blockflцte Susi: Strolchi-Puppe
Нужно сделать двусвязный список, который содержит имена детей ,желания и "частоту желаний", добавляя эновый элемент в конец списка. Вобщем смысл : создавать для кадой строчки текстового файла элемент списка и считывать туда эту строчку. примерный код:
PROGRAM Wishes; USES Wincrt; TYPE WishNodePtr = ^WishNode; WishNode = RECORD prev, next: WishNodePtr; whish: STRING; (*the wish*) n: INTEGER; (*number of occurences of the wish*) END; (*RECORD*)
FUNCTION READFROMFILE ; var list, NewNode, previous : WishNodePtr; BEGIN List:= Nil; WHILE not EOF DO BEGIN (* здесь условие: для первой строчки файла создаем элемент *) new(List); list^.prev:= NIL; list^.next := NIL; list^.wish := s; previous := list; (* здесь условие: для всех остальных строчек файла *)
Не могу сообразить что это за условие может быть. Или это вообще делается по-другому
volvo
7.01.2010 18:51
Цитата
Не могу сообразить что это за условие может быть.
Ты о чем?
Вот об этом условии, что-ли:
head := nil; tail := nil; while not eof(f) do begin if head = nil then { первый элемент } else { уже не первый, добавлять к tail^.next } end;
?
Сколько уже таких тем было, неужели же настолько сложно посмотреть на форуме, как организуется список? Почему КАЖДЫЙ думает, что именно его задание - самое важное, и именно его не было на форумах и вообще, его дали в первый раз. Уверяю вас, я на форумах за 6 лет не встретил НИ ОДНОГО оригинального задания, кругом копи/пасты (из каких-то учебников, из файлопомоек, из старых добрых задачников начиная с 1988 года, по которым я в свое время учился, поэтому большинство задач оттуда помню наизусть). Нет ничего нового. Куда мир катится - непонятно.
Ozzя
8.01.2010 17:34
Цитата
из старых добрых задачников начиная с 1988 года
Оффтоп он Кивает в знак согласия. Пильщиков, Абрамов..., Дьяконов etc Оффтоп офф
Цитата
Куда мир катится - непонятно.
туды
lopata
13.01.2010 21:25
Помогите пожалуйста составить алгоритм.
lopata
15.01.2010 9:06
Я понимаю что всем пофиг, но может все-таки кто-нибудь посмотрит условие немного изменилось: у именам "прикреплены" (плохо владею терминами на русском языке) односвязные списки, содержащие имена с одинаковыми пожеланиями.
PROGRAM Wishes; TYPE WishNodePtr = ^WishNode; WisherNodePtr= ^WisherNode; WishNode = RECORD prev, next: WishNodePtr; wish: STRING; n: INTEGER; wishers: WisherNodePtr; END; Wishlist = RECORD first: WishNodePtr; last: WishNodePtr; END; WisherNode = RECORD name: string; next: WisherNodePtr; END;
PROCEDURE Append(VAR list: WishList; node: WishNodePtr); BEGIN IF list.last = NIL THEN BEGIN list.first := node; list.last := node; END ELSE BEGIN node^.next := nil; node^.prev := list.last; node^.prev^.next := node; list.last := node; END; END;
FUNCTION GetNodeWish(list: WishList; wish: string): WishNodePtr; var n: WishNodePtr; begin n := list.first; while (n <> nil) do begin if n^.wish = wish then begin GetNodeWish := n; Exit; end; n := n^.next; end; GetNodeWish := nil; end;
PROCEDURE ReadFromFile(VAR list: WishList; path: string); VAR wish, wisher, s: string; currentNode: WishNodePtr; wisherN, curWisher: WisherNodePtr; t: Text; BEGIN Assign(t, path); Reset(t); while not Eof(t) do begin ReadLn(t, s); if (s[length(s)]=':') then begin wisher := copy(s, 1, length(s) - 1); wish := ''; end else wish := s;
if (wish <> '') and (wisher <> '') then begin currentNode := GetNodeWish(list, wish);
if (currentNode = nil) then begin currentNode := CreateNewNode(wish, wisher); end else begin currentNode^.n := currentNode^.n + 1; curWisher := currentNode^.wishers; while (curWisher <> nil) do begin if (curWisher^.next = nil) and (curWisher^.name <> wisher) then begin New(wisherN); wisherN^.next := nil; wisherN^.name := wisher; curWisher^.next := wisherN; break; end; curWisher := curWisher^.next; end; end; Append(list, currentNode); end; end; END;
procedure OutputWishes(list: WishList); var currentWish: WishNodePtr; currentWisher: WisherNodePtr; begin currentWish := list.first; while currentWish <> nil do begin WriteLn(currentWish^.wish, ':'); currentWisher := currentWish^.wishers; while currentWisher <> nil do begin WriteLn('Wisher: ', currentWisher^.name); currentWisher := currentWisher^.next; end; currentWish := currentWish^.next; end; end;
procedure DestroyWishes(var list: WishList); var currentWish, delWish: WishNodePtr; currentWisher, delWisher: WisherNodePtr; begin currentWish := list.first; while currentWish <> nil do begin currentWisher := currentWish^.wishers; while currentWisher <> nil do begin delWisher := currentWisher; currentWisher := currentWisher^.next; Dispose(delWisher); end; delWish := currentWish; currentWish := currentWish^.next; Dispose(delWish); end; end;
BEGIN ReadFromFile(list, '/Users/asv2001/Desktop/Uebung 9/wishes.txt'); OutputWishes(list); DestroyWishes(list); END.
Код далеко неидеальный, но просто больше нет сил его мучать.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.