// ord_1234.cpp (C) 2005 adolfo@di-mare.com // Programita para calificar preguntas de punteros en la lista // http://www.di-mare.com/adolfo/cursos/2002-2/p2-ea-1.htm#clista::Orden_2143%28%29 struct node { node* next; int val; node(int i) : next(0), val(i) { } }; void L_print( node* L , bool eol=true ); #include using namespace std; /* Watches <==> Code::Blocks L L->val L->next->val L->next->next->val L->next->next->next->val temp->val Last->val */ int main_1234() { node *L, *Last, *temp; node *&last = Last; node *&p = temp; // lista L=(4,3,2,1) temp = 0; L = new node(4); L->next = new node(3); L->next->next = new node(2); L->next->next->next = new node(1); // Hasta aquí "L" es una lista simple L->next->next->next->next = L; // Aquí hace la lista circular Last = L->next->next->next; // "Last" es el último nodo // Solucion para la lista circular L=(4,3,2,1) L_print( Last ); { p = Last->next; Last->next = p->next->next; Last->next->next->next = p->next; Last->next->next->next->next = p; p->next = Last; Last = p; } L_print( Last ); // No toque // descubrí que lo más rápido es L = Last->next; // 1) poner "->next" en click derecho temp = temp; // 2) escribir a mano cada asignación de punteros // lista L=(8,9,6,7,2,4) temp = 0; L = new node(8); L->next = new node(9); L->next->next = new node(6); L->next->next->next = new node(7); L->next->next->next->next = new node(2); L->next->next->next->next->next = new node(4); L->next->next->next->next->next->next = L; Last = L->next->next->next->next->next; // Circular temp = L->next->next->next->next->next; L->next->next->next->next->next = L->next; L = L->next->next->next; temp->next->next->next->next = temp; temp->next->next = L; L = temp->next->next->next->next->next; // No toque // descubrí que lo más rápido es L = Last->next; // 1) poner "->next" en click derecho temp = temp; // 2) escribir a mano cada asignación de punteros return 0; } // Watch: // L // *L,r // *L->next,r // *L->next->next,r // *L->next->next->next,r // *L->next->next->next->next,r // *L->next->next->next->next->next,r // *L->next->next->next->next->next->next,r // *temp,r // *Last,r int main_8924() { node *L, *Last, *temp; node *&last = Last; node *&p = temp; // lista L=(8,9,6,7,2,4) temp = 0; L = new node(8); L->next = new node(9); L->next->next = new node(6); L->next->next->next = new node(7); L->next->next->next->next = new node(2); L->next->next->next->next->next = new node(4); L->next->next->next->next->next->next = L; Last = L->next->next->next->next->next; // Circular // Solucion para la lista circular L=(8,9,6,7,2,4) temp = last->next; Last->next = temp->next->next; temp->next->next = Last->next->next->next; Last->next->next->next = temp; Last = temp->next; // No toque L = Last->next; temp = temp; // Solucion para la lista circular L=(8,9,6,7,2,4) temp = last->next; Last->next = temp->next->next; temp->next->next = Last->next->next->next; Last->next->next->next = temp; Last = temp->next; return 0; } // Watch: // L // *L,r // *L->next,r // *L->next->next,r // *L->next->next->next,r // *temp,r // *Last,r int main_123() { node *L, *Last, *temp; node *&last = Last; node *&p = temp; // lista L=(3,2,1) L = new node(3); L->next = new node(2); L->next->next = new node(1); L->next->next->next = 0; // Lista simple L->next->next->next = L; // Lista circular Last = L->next->next; L = Last; // L[0] < L[1] if ( L->next->val > L->next->next->val ) { temp = L->next->next; L->next->next = temp->next; temp->next = L->next; L->next = temp; } // L[1] < L[2] if ( L->next->next->val > L->val ) { L = L->next; temp = L->next->next; L->next->next = temp->next; temp->next = L->next; L->next = temp; L = L->next->next; } // L[0] < L[1] if ( L->next->val > L->next->next->val ) { temp = L->next->next; L->next->next = temp->next; temp->next = L->next; L->next = temp; } // lista L=(4,3,2) L = new node(4); L->next = new node(3); L->next->next = new node(2); L->next->next->next = 0; // Lista simple // L[0] < L[1] if ( L->val > L->next->val ) { temp = L->next; L->next = temp->next; temp->next = L; L = temp; } // L[1] < L[2] if ( L->next->val > L->next->next->val ) { temp = L->next->next; L->next->next = temp->next; temp->next = L->next; L->next = temp; } // L[0] < L[1] if ( L->val > L->next->val ) { temp = L->next; L->next = temp->next; temp->next = L; L = temp; } int i; int M[6][3] = { 1,2,3, 1,3,2, 2,1,3, 2,3,1, 3,1,2, 3,2,1 }; for (i=0; i<6; ++i) { L = new node( M[i][0] ); L->next = new node( M[i][1] ); L->next->next = new node( M[i][2] ); L->next->next->next = 0; // L[0] < L[1] if ( L->val > L->next->val ) { temp = L->next; L->next = temp->next; temp->next = L; L = temp; } // L[1] < L[2] if ( L->next->val > L->next->next->val ) { temp = L->next->next; L->next->next = temp->next; temp->next = L->next; L->next = temp; } // L[0] < L[1] if ( L->val > L->next->val ) { temp = L->next; L->next = temp->next; temp->next = L; L = temp; } if ( (L->val > L->next->val) || (L->next->val > L->next->next->val) || (L->next->next->next != 0) ) { cout << endl << "ERROR ==> (" << M[i][1] << ',' << M[i][0] << ',' << M[i][2] << ')'; } } // No toque L = Last->next; temp = temp; /* NULL +-----+---+ +-----+---+ +-----+---+ L.m_first-->| 4 | *-|-->| 3 | *-|-->| 2 | 0 | +-----+---+ +-----+---+ +-----+---+ /\ /\ /\ || || || temp temp */ } /// Graba 5 nodos a partir de L->next. void L_print( node* L , bool eol ) { std::cout << "[" << L->next->val; std::cout << "," << L->next->next->val; std::cout << "," << L->next->next->next->val; std::cout << "," << L->next->next->next->next->val; std::cout << "," << L->next->next->next->next->next->val; std::cout << "]"; // Marca con '!' ciclo repetido if (( L->next->next->next->next->next == L || L->next->next->next->next->next == L->next->next->next->next || L->next->next->next->next->next == L->next->next->next || L->next->next->next->next->next == L->next )) { std::cout << "! (repetido)"; } if (eol) { std::cout << "\n"; } } int main() { main_1234(); main_123(); return 0; } // ord_1234.cpp