Форум «Всё о Паскале» _ Ада и другие языки _ Переделать задачу из паскаля по работе со списками
Автор: Zas 25.02.2007 1:57
Добрый вечер. немного модифицировал данную на форуме программу по работе с односторонними списками, перевел на нужный язык..., добывил несколько процедур. Нужно написать аналогичную программу в Си. В си программировал очень редко, поэтому незнаю пунктуации, и некоторых вещей, кому не сложно, помогите пожалуйста, вот код программы в паскале( все что написано в 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 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 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;
(проверить не могу, языком, на который была переведена программа не владею. Вот кстати еще одна причина, по которой СНАЧАЛА отлаживается логика, и только когда она работает безукоризненно - делается интерфейс... Я устал это повторять, не хотите понимать - мучайтесь теперь...)