listas doblemente ligadas
Transcript of listas doblemente ligadas
ALGORITMOS Y ESTRUCTARA DE DATOS
LISTAS DOBLEMENTE ENLAZADAS
Defi niciones
• Cada nodo de una lista doblemente enlazada tiene dos enlaces, además de los campos de datos. Un enlace, el derecho, se utiliza para navegar la lista hacia delante. El otro enlace, el izquierdo, se utiliza para navegar la lista hacia atrás.
• Las Listas pueden crear, actualizar y eliminar elementos.
• En las Listas la posición de los elementos es relevante.
• Las Listas admiten elementos duplicados.
• Las Listas tienen dos protocolos, uno secuencial y el otro directo
DIAGRAMA DE FLUJO DE UN PROGRAMA QUE SUMA FUERZAS
#include<stdio.h>#include<stdlib.h>//definición de tipo de datos vectortypedef struct {
int compX; //componente en xint compY; //componente en yint compZ; //componente en zstruct vector *apSig; //apuntador a vectorstruct vector *apAnt; //apuntador a vector
}Vector; //fin de creación de tipo vector
Vector leeVector(); //prototipo de función que regresa un tipo de dato Vector
• int main()• {
• Vector *inicio; //apuntadores externos para manejar la lista doblemente enlazada
• Vector *ultimo;• Vector *siguiente;• Vector *anterior;
• Vector resultante; //variable del tipo Vector
• int numFuerzas=0;• int i=0;
•resultante.apAnt=NULL;//inicializacion
• resultante.apSig=NULL;• resultante.compX=0;• resultante.compY=0;• resultante.compZ=0;
• system("cls"); //limpia pantalla
• printf("Ingrese la cantidad de fuerzas que se aplicaran al sistema :");
•scanf("%d",&numFuerzas); //se piden las fuerzas al usuario
• inicio = (Vector *)malloc(sizeof(Vector)); //reserva un espacio de tamaño vector para guardar vectores y se le pasa la dirección de memoria al puntero inicio
• printf("\n\ningrese los datos del primer vector\n");
• *inicio = leeVector(); //se le asignan datos al primer nodo de la lista
• ultimo = inicio; //y también al puntero ultimo
• for(i=1;i<numFuerzas;i++)• {• printf("\nIngresa los
datos del vector: %d",i+1);• siguiente =
(Vector*)malloc(sizeof(Vector)); //reserva un espacio de tamaño vector para guardar vectores y se le pasa la dirección de memoria al puntero siguiente
• *siguiente = leeVector(); //se le asignan datos al primer nodo de la lista
• siguiente->apAnt = ultimo; //el nuevo nodo en su campo apAnt apunta a donde apunta último
• ultimo->apSig = siguiente; //al nodo que apunta último, en su campo apSig apunta a lo que apunta siguiente
• ultimo = siguiente; //último apunta a lo que apunta siguiente
• } //fin de for
• anterior = ultimo; //anterior apunta a lo que apunta ultimo
• for(i=numFuerzas;i>0;i--)• {• resultante.compX += anterior->compX;
//al campo compX de resultante, se le asigna el valor de la componente x del nodo al que apunta anterior
• resultante.compY += anterior->compY;• resultante.compZ += anterior->compZ;• anterior = anterior->apAnt;
//anterior apunta, a lo que apunta en su campo apAnt, el nodo al que apunta anterior
• } //fin de for
• //impresión de la resultante• printf("\n\nla resultante es:(%d)i+(%d)j+
(%d)k“ ,resultante.compX,resultante.compY,resultante.compZ);
• //free(inicio);• printf("\n\n");• system("pause"); //ingresa una pausa• return 0; //indica terminación exitosa del
programa• } //fin de main
//Inicio de la función lee vector• Vector leeVector()• {• Vector
fuerza={0,0,0,NULL,NULL}; //crea una variable del tipo Vector y la inicializa
• int x=0;• int y=0;• int z=0;
• printf("\n\nIngresa el valor de la componente en x: "); //ingreso de componentes
• scanf("%d",&x);
//por parte del usuario
• printf("\nIngresa el valor de la componente en y: ");
• scanf("%d",&y);• printf("\nIngresa el valor de la
componente en z: ");• scanf("%d",&z);
• fuerza.compX = x; //asignación de valores al vector
• fuerza.compY = y;• fuerza.compZ = z;
• return fuerza; //regresa un tipo de datos Vector; es decir al vector fuerza
• } //fin de función lee Vector
ALUMNOS:
DAVID ALEJANDRO DIAZ TECANTE
DAVID RODRIGUEZ FLORES