IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Переделать задачу из паскаля по работе со списками, C
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Юрий

Репутация: -  0  +


Добрый вечер.
немного модифицировал данную на форуме программу по работе с односторонними списками, перевел на нужный язык..., добывил несколько процедур. Нужно написать аналогичную программу в Си. В си программировал очень редко, поэтому незнаю пунктуации, и некоторых вещей, кому не сложно, помогите пожалуйста, вот код программы в паскале( все что написано в write не нужно писать... дополню):
Код

program 1;
uses CRT;

type pt = ^elem;
     elem = record
           info : byte;
           next : pt;
     end;

//******************************************************************************

function getprelastel (list:pt):pt;
var nextel:pt;
begin
     if (list<>NIL) then
        begin
          nextel:=list;
          repeat
                list:=nextel;
            if (list^.next<>NIL) then
               nextel:=list^.next;
          until (nextel^.next=NIL);
          getprelastel:=list;
        end
     else
         getprelastel:=NIL;
end;
//______________________________________________________________________________
//******************************************************************************

function getlastel (list:pt):pt;
begin
     if (list<>NIL) then
        begin
          while (list^.next<>NIL) do
                list:=list^.next;
          getlastel:=list;
        end
     else
         getlastel:=NIL;
end;
//______________________________________________________________________________
//******************************************************************************

function searchel (list:pt;info:byte):pt;
begin
     if (list<>NIL) then
        begin
          while ((list^.next<>NIL) and (list^.info<>info)) do
            list:=list^.next;
           if (list^.info<>info) then
         searchel:=NIL
            else
          searchel:=list;
        end
     else
        begin
          searchel:=NIL;
        end;
end;
//______________________________________________________________________________
//******************************************************************************

function searchpreel (list:pt;info:byte):pt;
var nextel:pt;
begin
     if (list<>NIL) then
     begin
          nextel:=list;
      repeat
            list:=nextel;
        if (list^.next<>NIL) then
           nextel:=list^.next;
      until ((nextel^.next=NIL) or (nextel^.info=info));
      if (nextel^.info<>info) or (nextel=list) then
         searchpreel:=NIL
      else
          searchpreel:=list;
     end
     else
         begin
          searchpreel:=NIL;
     end;
end;
//______________________________________________________________________________
//******************************************************************************

function getelem(elname:string):byte;
var ret:byte;
begin
    write('Iveskite ',elname,' : ');
    readln(ret);
        getelem:=ret;
end;
//______________________________________________________________________________
//******************************************************************************


procedure addtobegin (var list:pt;info:byte);
var newelem:pt;
begin
    new(newelem);
    newelem^.info:=info;
    newelem^.next:=list;
    list:=newelem;
end;

//______________________________________________________________________________
//******************************************************************************


procedure addafter (listel:pt;info:byte);
var newelem,temp:pt;
begin
     temp:=searchel(listel, getelem('Ieskomo elemento reiksme'));
     if ((listel<>NIL) and (temp<>NIL)) then
        begin
          new(newelem);
          newelem^.info:=info;
          newelem^.next:=temp^.next;
          temp^.next:=newelem;
        end;
end;

//______________________________________________________________________________
//******************************************************************************


procedure addtoend (var list:pt;info:byte);
begin
    if (list=NIL) then
           addtobegin(list,info)
    else
        addafter(getlastel(list),info);
end;

//______________________________________________________________________________
//******************************************************************************


procedure addbefore (listel:pt;info:byte);
var newelem, temp:pt;
begin
    temp:=searchel(listel, getelem('Ieskomo elemento reiksme'));
    if ((listel<>NIL) and (temp<>NIL)) then
       begin
        new(newelem);
        newelem^.info:=temp^.info;
        temp ^.info:=info;
        newelem^.next:=temp^.next;
        temp^.next:=newelem;
       end;
end;

//______________________________________________________________________________
//******************************************************************************

procedure delfirstel(var list:pt);
var temp:pt;
begin
    if (list<>NIL) then
    begin
         temp:=list;
         list:=list^.next;
         dispose(temp);
    end;
end;

//______________________________________________________________________________
//******************************************************************************


procedure dellastel(var list:pt);
var temp:pt;
begin
    if (list<>NIL) then
       if (list^.next=NIL) then
          delfirstel(list)
       else
         begin
           temp:=getprelastel(list);
           dispose(temp^.next);
           temp^.next:=NIL;
         end;
end;

//______________________________________________________________________________
//******************************************************************************


procedure delel(var list:pt;el:pt);
var temp,temp1 :pt;
begin
    temp1:=searchel(list, getelem('Pasalinamo elemento reikshme'));
    if ((list<>NIL) and (el<>NIL) and (temp1<>NIL)) then
       begin
            if (temp1^.next=NIL) then
           if (list^.next=NIL) then
              delfirstel(list)
           else
               dellastel(list)
        else
           begin
          temp:=temp1^.next;
          temp1^.info:=temp^.info;
          temp1^.next:=temp^.next;
          dispose(temp);
            end;
        end;
end;

//______________________________________________________________________________
//******************************************************************************


procedure delbefore(var list:pt;info:byte);
var temp:pt;
begin
    if (list<>NIL) then
    begin
        temp:=searchpreel(list,info);
        delel(list,temp);
    end;
end;

procedure delafter(var list:pt;info:byte);
var temp:pt;
begin
     if (list<>NIL) then
     begin
          temp:=searchel(list,info);
      temp:=temp^.next;
          delel(list,temp)
     end;
end;

//______________________________________________________________________________
//******************************************************************************


procedure printlist (list:pt);
begin
    clrscr;
    if (list=NIL) then
       writeln('Sarasas Tuscias!')
    else
        while (list<>NIL) do
              begin
               write(list^.info);
               list:=list^.next;
               if (list<>NIL) then
                  write(',')
               else
                   write('.');
               end;
    readkey;
end;

//______________________________________________________________________________
//******************************************************************************

procedure checkel(list:pt;info:byte);
begin
    if (searchel(list,info)<>NIL) then
        writeln('Elementas ',info,' egzistuoja.')
    else
        writeln('Elemento ',info,' nera.');
    readkey;
end;
//_____________________________________________________________________________
procedure listclear ( var list: pt );
var
templist: pt;
begin
while list <> nil do
begin
  templist :=list;
  list:=list^.Next;
  dispose(templist);
end;
end;







procedure showmenu;
begin
    clrscr;
    Writeln('1) Irasyti elementa i saraso pradzia');
    Writeln('2) Irasyti elementa i saraso pabaiga');
    Writeln('3) Pasalinti pirma elementa is saraso');
    Writeln('4) Pasalinti paskutini elementa is saraso');
    Writeln('5) Patinkrinti ar egzistuoja nurodytas elementas');
    Writeln('6) Pasalinti nurodyta elementa');
    Writeln('7) Iterpti elementa po nurodyto');
    Writeln('8) Iterpti elementa pries nurodyta');
    Writeln('9) Pasalinti elementa po nurodyto');
    Writeln('10) Pasalinti elementa pries nurodyta');
    Writeln('11) Isspausdinti sarasa');
    Writeln('12) Istrinti sarasa');
    Writeln('13) Iseiti is programos');
    Writeln;
    Write(' Jusu pasirinkimas : ');
end;

var root: pt;
    selection : byte;

begin
    root:=NIL;
    repeat
        showmenu;
        readln(selection);
        writeln;

         case selection of
            1: addtobegin(root,getelem('elemento reiksme'));
            2: addtoend(root,getelem('elemento reiksme'));
            3: delfirstel(root);
            4: dellastel(root);
            5: checkel(root,getelem('Ieskomo elemento reiksme'));
            6: delel(root,root);
            7: addafter(root,getelem('Iterpiamo elemento reiksme'));
            8: addbefore(root,getelem('Iterpiamo elemento reiksme'));
            9: delafter(root,getelem('Ieskomo elemento reiksme'));
            10: delbefore(root,getelem('Ieskomo elemento reiksme'));
            11: printlist(root);
            12: listclear(root);
            13: clrscr;

        end;
    until selection=13;

end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Дословно - так:
Прикрепленный файл  L.CPP ( 5.5 килобайт ) Кол-во скачиваний: 376


Если работало в Паскале, должно работать и в С...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Юрий

Репутация: -  0  +


Огромное спасибо, буду сейчас разбираться. Еще такой вопрос к какому пакету относятся clrcsr и getch? conio.h?

И еще вопрос при выполнении функции listclear выдает ошибку.... компилирую в Borland C++
Thread stop Access violation at 0x401460

Сообщение отредактировано: Zas -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Юрий

Репутация: -  0  +


Вопрос всё еще актуален, процедура listclear в Си из вышенаписанной программы не работает, скажите пожалуйста в чем ошибка.

Сообщение отредактировано: Zas -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
процедура listclear в Си из вышенаписанной программы не работает

Возможно, вот из-за этого:

void listclear(pt *list) {

pt templist;
while(*list) { /* <-- здесь добавлено разыменование */
templist = *list;
*list = (*list) -> next;
free(templist);
}

}
(проверить не могу, языком, на который была переведена программа не владею. Вот кстати еще одна причина, по которой СНАЧАЛА отлаживается логика, и только когда она работает безукоризненно - делается интерфейс... Я устал это повторять, не хотите понимать - мучайтесь теперь...)
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.11.2020 5:58
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name