Помощь - Поиск - Пользователи - Календарь
Полная версия: текстовый файл. двусвязные списки.
Форум «Всё о Паскале» > 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.



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