Помощь - Поиск - Пользователи - Календарь
Полная версия: текстовый файл. двусвязные списки.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
lopata
Есть текстовый файл, который содержит имена детей и их желание на НГ. Выглядет это так :
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;
(* здесь условие: для всех остальных строчек файла *)

New(NewNode);
NewNode^.next := NIL;
NewNode^.prev := previous;
NewNode^.wish := s;
previuos := NewNode;
END;
.
.
.



Не могу сообразить что это за условие может быть.
Или это вообще делается по-другому
volvo
Цитата
Не могу сообразить что это за условие может быть.
Ты о чем?

Вот об этом условии, что-ли:
head := nil; tail := nil;
while not eof(f) do
begin
if head = nil then { первый элемент }
else { уже не первый, добавлять к tail^.next }
end;
?

Сколько уже таких тем было, неужели же настолько сложно посмотреть на форуме, как организуется список? Почему КАЖДЫЙ думает, что именно его задание - самое важное, и именно его не было на форумах и вообще, его дали в первый раз. Уверяю вас, я на форумах за 6 лет не встретил НИ ОДНОГО оригинального задания, кругом копи/пасты (из каких-то учебников, из файлопомоек, из старых добрых задачников начиная с 1988 года, по которым я в свое время учился, поэтому большинство задач оттуда помню наизусть). Нет ничего нового. Куда мир катится - непонятно.
Ozzя
Цитата
из старых добрых задачников начиная с 1988 года

Оффтоп он
Кивает в знак согласия. Пильщиков, Абрамов..., Дьяконов etc wacko.gif
Оффтоп офф

Цитата
Куда мир катится - непонятно.

туды norespect.gif
lopata
Помогите пожалуйста составить алгоритм.
lopata
Я понимаю что всем пофиг, но может все-таки кто-нибудь посмотрит
условие немного изменилось: у именам "прикреплены" (плохо владею терминами на русском языке) односвязные списки, содержащие имена с одинаковыми пожеланиями.

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;

VAR
list:WishList;

FUNCTION CreateNewNode(wish, wisher: string): WishNodePtr;
VAR
n: WishNodePtr;
firstWisher: WisherNodePtr;
BEGIN
New(n);
n^.prev := NIL;
n^.next := NIL;
n^.wish := wish;
n^.n := 1;
New(firstWisher);
firstWisher^.name := wisher;
firstWisher^.next := NIL;
n^.wishers := firstWisher;
CreateNewNode := n;
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.



Код далеко неидеальный, но просто больше нет сил его мучать.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.