1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Есть текстовый файл, который содержит имена детей и их желание на НГ. Выглядет это так : 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; (* здесь условие: для всех остальных строчек файла *)
head := nil; tail := nil; while not eof(f) do begin if head = nil then { первый элемент } else { уже не первый, добавлять к tail^.next } end;
?
Сколько уже таких тем было, неужели же настолько сложно посмотреть на форуме, как организуется список? Почему КАЖДЫЙ думает, что именно его задание - самое важное, и именно его не было на форумах и вообще, его дали в первый раз. Уверяю вас, я на форумах за 6 лет не встретил НИ ОДНОГО оригинального задания, кругом копи/пасты (из каких-то учебников, из файлопомоек, из старых добрых задачников начиная с 1988 года, по которым я в свое время учился, поэтому большинство задач оттуда помню наизусть). Нет ничего нового. Куда мир катится - непонятно.
Я понимаю что всем пофиг, но может все-таки кто-нибудь посмотрит условие немного изменилось: у именам "прикреплены" (плохо владею терминами на русском языке) односвязные списки, содержащие имена с одинаковыми пожеланиями.
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.
Код далеко неидеальный, но просто больше нет сил его мучать.