Перейти к содержанию
Авторизация  
Mizuwokiru

[Pascal] Связанный список

Рекомендуемые сообщения

В общем, суть проблемы:

Есть заранее заполненный словами файл, который считывается программой в начале. Слова записываются в связанный список, состоящий из самого слова, количество его дубликатов и указатель на следующий элемент.

Вот что я накодил:

program LR3_LinkedList;
uses crt;
 
type mystr = string[25];
     pnode = ^node;
     node = record
         worrd: mystr;
         count: byte;
         next: pnode;
     end;
 
function CreateNode(new_word: mystr): pnode;
var new_node: pnode;
begin
    new(new_node);
    new_node^.worrd := new_word;
    new_node^.count := 1;
    new_node^.next := nil;
    CreateNode := new_node;
end;
 
procedure AddBefore(p, new_node: pnode);
var temp: node;
begin
    temp := p^;
    p^ := new_node^;
    new_node^ := temp;
    p^.next := new_node;
end;
 
function Find(head: pnode; new_word: mystr): pnode;
var q: pnode;
begin
    q := head;
    while (q <> nil) and (new_word <> q^.worrd) do
        q := q^.next;
    Find := q;
end;
 
function FindPlace(head: pnode; new_word: mystr): pnode;
var q: pnode;
begin
    q := head;
    while (q <> nil) and (new_word > q^.worrd) do
        q := q^.next;
    FindPlace := q;
end;
 
procedure CoolWrite(str: string);
var i: byte;
begin
    Write(str);
    for i := 1 to 10 do
    begin
        Write('.');
        Delay(200);
    end;
    WriteLn;
end;
 
procedure ClearMemory(var p: pnode);
var q: pnode;
begin
    while p <> nil do
    begin
        q := p;
        while q^.next <> nil do
            q := p^.next;
        dispose(q);
    end;
end;
 
function GetWord(var f: text): mystr;
var c: char;
begin
    GetWord:= '';
    while not eof(f) do
    begin
        read(f, c);
        if (c <= ' ') and (GetWord <> '') then
            break
        else if c > ' ' then
            GetWord := GetWord + c;
    end;
end;
 
var head, tmpnode, tmpnode2: pnode; f: text; tmpword: mystr; i: byte;
begin
 
    clrscr;
    CoolWrite('Открываем файл');
    assign(f, 'C:\text.txt');
    reset(f);
    tmpword := GetWord(f);
    head := CreateNode(tmpword);
    while not eof(f) do
    begin
        tmpword := GetWord(f);
        if tmpword = '' then
            break;
        tmpnode := Find(head, tmpword);
        // Где-то отсюда выбивает exitcode = 216
        if tmpnode^.worrd = tmpword then
            Inc(tmpnode^.count)
        else
        begin
            tmpnode := FindPlace(head, tmpword);
            tmpnode2 := CreateNode(tmpword);
            AddBefore(tmpnode, tmpnode2);
        end;
    end;
    close(f);
    assign(f, 'C:\result.txt');
    rewrite(f);
    tmpnode := head;
    while tmpnode <> nil do
    begin
        WriteLn(f, tmpnode^.worrd:15, tmpnode^.count:5);
        tmpnode := tmpnode^.next;
    end;
    close(f);
    readkey;
    ClearMemory(head);
end.

Изменено пользователем DiQuero

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

паскали разные есть

 

"где-то отсюда выбивает", это как так "где-то отсюда" ?

то есть не знаешь даже где, как такое может быть?

и, имея код ошибки, в чем проблема разобраться в причине ошибки?

Изменено пользователем fireday2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

паскали разные есть

 

"где-то отсюда выбивает", это как так "где-то отсюда" ?

то есть не знаешь даже где, как такое может быть?

и, имея код ошибки, в чем проблема разобраться в причине ошибки?

1. Этот код должен по идее запуститься как на FPC, так и на Turbo Pascal/Borland Pascal.

2. Написал я сюда, ибо не было времени искать ошибку, так как помимо этого мне нужно было сделать 10 лаб.

3. "Где-то отсюда" - не так выразился, выбивает на проверке условия (скорее всего что-то не так в обращении к полю записи). Также, у меня там были проблемы с этим новым 3-им паскалем, мб из-за этого все.

4. 216 ошибка на сколько я помню отвечает за обращение к элементу массива по недопустимому номеру, но может быть у него более абстрактное определение, о котором я не знаю.

В итоге от твоего поста толку 0.

 

P.S.: Тему можно закрыть, препод код не проверял, лабу сдал :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. "по идее"

2. не было времени искать, да ладно, ты всерьез думаешь что у других есть время разбирать твой код и искать ошибку, когда у тебя все на глазах ?

3. "скорее всего", "мб из-за этого". говорит о том, что ты не разобрался в сути проблемы , но поспешил на форум

4. "насколько помню" - не помнишь , не беда, интернет под рукой

 

форум - не волшебная палочка

 

от поста толк есть, если ты его не увидел, это другое дело

 

п.с. поздравляю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретнее сформулируйте проблему? Я просто больше спец по плюсам

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретнее сформулируйте проблему? Я просто больше спец по плюсам

ты спец по мультиаккам и набиву потосв, да и то посредственный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...