C/C++ Programming: Lab 2. Encoding from Pascal

You must submit this lab at the end of next tutorial.

For someone, who has difficulties to encode the program handed in the labs. At the end of this tutorial you have to understand how dynamic memory works and what the dynamic memory allocation do.

Encode the following programs in C, execute it and define what do they perform.

NOTES: 

1. dispose() is analog of delete operator in Pascal.

2. nil in Pascal is NULL in C.


PROGRAM 1:

	program pointers3( output );
	type	int_pointer = ^integer;

	var	iptr1, iptr2 : int_pointer;
	begin
		new( iptr1 );
		new( iptr2 );
		iptr1^ := 10;
		iptr2^ := 25;
		writeln('the value of iptr1 is ', iptr1^);
		writeln('the value of iptr2 is ', iptr2^);
		dispose( iptr1 );
		iptr1 := iptr2;
		iptr1^ := 3;
		writeln('the value of iptr1 is ', iptr1^);
		writeln('the value of iptr2 is ', iptr2^);
		dispose( iptr2 );
	end.


PROGRAM 2:

	program PointerRecordExample( output );

	type  rptr = ^recdata;
		recdata = record
			number : integer;
			code   : string;
			nextrecord : rptr
		end;

	var  startrecord : rptr;

	begin
		new( startrecord );
		if startrecord = nil then
		begin
			writeln('1: unable to allocate storage space');
			exit
		end;
		startrecord^.number := 10;
		startrecord^.code := 'This is the first record';
		new( startrecord^.nextrecord );
		if startrecord^.nextrecord = nil then
		begin
			writeln('2: unable to allocate storage space');
			exit
		end;
		startrecord^.nextrecord^.number := 20;
		startrecord^.nextrecord^.code := 'This is the second record';
		new( startrecord^.nextrecord^.nextrecord );
		if startrecord^.nextrecord^.nextrecord = nil then
		begin
			writeln('3: unable to allocate storage space');
			exit
		end;
		startrecord^.nextrecord^.nextrecord^.number := 30;
		startrecord^.nextrecord^.nextrecord^.code := 'This is the third record';
		startrecord^.nextrecord^.nextrecord^.nextrecord := nil;
		writeln( startrecord^.number );
		writeln( startrecord^.code );
		writeln( startrecord^.nextrecord^.number );
		writeln( startrecord^.nextrecord^.code );
		writeln( startrecord^.nextrecord^.nextrecord^.number );
		writeln( startrecord^.nextrecord^.nextrecord^.code );
		dispose( startrecord^.nextrecord^.nextrecord );
		dispose( startrecord^.nextrecord );
		dispose( startrecord )
	end.

PROGRAM 3:
	program PointerRecordExample2( output );

	type  rptr = ^recdata;
		recdata = record
			number : integer;
			code   : string;
			nextrecord : rptr
		end;

	var  startrecord, listrecord : rptr;

	begin
		new( listrecord );
		if listrecord = nil then
		begin
			writeln('1: unable to allocate storage space');
			exit
		end;
		startrecord := listrecord;
		listrecord^.number := 10;
		listrecord^.code := 'This is the first record';
		new( listrecord^.nextrecord );
		if listrecord^.nextrecord = nil then
		begin
			writeln('2: unable to allocate storage space');
			exit
		end;
		listrecord := listrecord^.nextrecord;
		listrecord^.number := 20;
		listrecord^.code := 'This is the second record';
		new( listrecord^.nextrecord );
		if listrecord^.nextrecord = nil then
		begin
			writeln('3: unable to allocate storage space');
			exit
		end;
		listrecord := listrecord^.nextrecord;
		listrecord^.number := 30;
		listrecord^.code := 'This is the third record';
		listrecord^.nextrecord := nil;
		while startrecord <> nil do
		begin
			listrecord := startrecord;
			writeln( startrecord^.number );
			writeln( startrecord^.code );
			startrecord := startrecord^.nextrecord;
			dispose( listrecord )
		end
	end.