estructuras dinamicas de datos

Arcangel
06 de Mayo del 2005
Hola…!
Soy alumno de la carrera de ciencias de la computación y quiero programas
En c++ específicamente sobre estructuras dinámicas de datos como listas doblemente enlazadas heredadas de la lista simple. ¡Gracias…!
Aquí esta el programita del movimiento de la tortuga, para los que recién empiezan a
Programar y si desean también les podría enviar el puzzle.

#include <iostream>
#include <conio.h>
#include <stdlib.h> // prototipo para atoi
#include <cstring> // prototipo para strtok

#define columnSize 20 // numero de columnas del piso
#define rowSize 20 // numero de filas del pìso

unsigned short floor[ rowSize ] [ columnSize ] = { { 0 } }; // piso de movimiento
int position[ 2 ] = { 0 }; // representa la posicion de la tortuga
enum Direction { ESTE = 1, SUR, OESTE, NORTE };

void advance( int distance, int paint, Direction d );
Direction rotate( Direction dire, int flag );
void print( void );

int main()
{
int pluma = 0, disposition;
Direction dir = ESTE;
char *command = new char[ 10 ];
char *commandPtr;
cout << "Comando Descripcionnn"
<< "1 Pluma hacia arriban"
<< "2 Pluma hacia abajon"
<< "3 Gira a la derechan"
<< "4 Gira a la izquierdan"
<< "5, n Avanzar n espaciosn"
<< "6 Imprimirn"
<< "9 Salirn";

cout << "nIntroduzca comando:n";

do {

cin.getline( command, 10 );

commandPtr = strtok( command, "," );
disposition = atoi( commandPtr );

switch ( disposition ) {
case 1:
pluma = 0;
break;

case 2:
pluma = 1;
break;

case 3:
dir = rotate( dir, 1 );
break;

case 4:
dir = rotate( dir, 0 );
break;

case 5:
commandPtr = strtok( NULL, "," );// obtiene la distancia
advance( atoi( commandPtr ), pluma, dir );
break;

case 6:
print();
break;

case 9:
break;
default:
cout << "nComando invalidonn";
}
} while ( disposition != 9 );

return 0;
}

void advance( int distance, int paint, Direction d )
{
int f = position[ 0 ], // numero de fila del arreglo floor
c = position[ 1 ]; // nemero de columna del arreglo floor

if ( d == ESTE) {
for ( int i = 0; i < distance; i++ ) {
if ( paint == 1 )
floor[ f ][ c++ ] = 1;
else
c++;

if ( c < columnSize ) // si se encuentra dentro de floor
continue;
else { // se sale del piso
position[ 1 ] = c - 1;
return;
}
}
position[ 1 ] = c;
}

if ( d == SUR ) {
for ( int i = 0; i < distance; i++ ) {
if ( paint == 1 )
floor[ f++ ][ c ] = 1;
else
f++;

if ( f < rowSize ) // si se encuentra dentro de floor
continue;
else { // se sale del piso
position[ 0 ] = f - 1;
return;
}
}
position[ 0 ] = f;
}

if ( d == OESTE ) {
for ( int i = 0; i < distance; i++ ) {
if ( paint == 1 )
floor[ f ][ c-- ] = 1;
else
c--;

if ( c >= 0 ) // si se encuentra dentro de floor
continue;
else { // se sale del piso
position[ 1 ] = c + 1;
return;
}
}
position[ 1 ] = c;
}
if ( d == NORTE ) {
for ( int i = 0; i < distance; i++ ) {
if ( paint == 1 )
floor[ f-- ][ c ] = 1;
else
f--;

if ( f >= 0 ) // si se encuentra dentro de floor
continue;
else { // se sale del piso
position[ 0 ] = f + 1;
return;
}
}
position[ 0 ] = f;
}
}

Direction rotate( Direction dire, int flag )
{
Direction izq, der;

if ( dire == ESTE ) { // si miro hacia el este mi
der = SUR; // derecha es el sur y mi
izq = NORTE; //izquierda es hacia el norte
}
else if ( dire == SUR ) {
der = OESTE;
izq = ESTE;
}
else if ( dire == OESTE ) {
der = NORTE;
izq = SUR;
}
else {
der = ESTE;
izq = OESTE;
}

if ( flag )
return der;
else
return izq;
}

void print( void )
{
for ( int row = 0; row < rowSize; row++ ) {
for ( int column = 0; column < columnSize; column++ )
cout << ( floor[ row ][ column ] ? '*' : ' ' );
cout << endl;
}

getch();
}