Section 7

Section 7

>> JASON HIRSCHHORN: Bienvenidos a todosa la Sección Siete. Estamos en la séptima semana del curso. Y este próximo Jueveses Halloween, así que estoy vestido como una calabaza. Yo no podía agacharse y poner enmis zapatos, así que es por eso que estoy sólo el uso de calcetines. Asimismo, no llevo nada debajoesto, así que no puedo quitarlo si es distraer a usted. Me disculpo de antemano por ello. No es necesario imaginar¿qué está pasando. Yo llevo calzoncillos. Así que está todo bien. >> Tengo una historia más larga de por qué estoyvestido como una calabaza, pero yo voy a guardar para más adelante en esta secciónporque yo quiero empezar. Tenemos un montón de cosas interesantespara repasar esta semana. La mayoría de ellos se refieren directamente a esteconjunto de problemas de la semana, las faltas de ortografía. Vamos a ir sobre ligadolistas y tablas hash para toda la sección. Pongo esta lista cada semana, una lista derecursos para usted para ayudarle con el material de este curso. Si en una pérdida o si busca algunaobtener más información, echa un vistazo a uno de estos recursos. >> Una vez más, es pset6 faltas de ortografía,conjunto de procesadores de esta semana. Y también te anima, y ​​yoanimaros, utilizar algún otro recursos específicamente para este conjunto de procesadores. En particular, los tres que heenumerado en la pantalla - gdb, que hemos estado familiarizados cony estado utilizando desde hace un tiempo, es va a ser de mucha ayuda esta semana. Así que puse que hasta aquí. Pero cada vez que se trabaja con C,siempre se debe utilizar gdb para depurar los programas. Esta semana también valgrind. ¿Alguien sabe lo que valgrind hace? >> AUDIENCIA: Comprueba si hay fugas de memoria? >> JASON HIRSCHHORN: Valgrindcheques para las pérdidas de memoria. Así que si algo malloc en suprograma, estás pidiendo memoria. Al final de su programa, usted tienepara escribir libre de todo lo que has malloced para dar la memoria. Si no escribes libre al final ysu programa llega a una conclusión, todo automáticamenteser liberado. Y para los pequeños programas, que esNo es gran cosa. Pero si usted está escribiendo un rodaje más largoprograma que no se cierra, necesariamente, en un par de minutos o unpar de segundos, a continuación, pérdidas de memoria puede convertirse en un gran negocio. >> Así que para pset6, la expectativa es queusted tendrá pérdidas de memoria cero con su programa. Para comprobar si hay fugas de memoria, valgrind ejecutary te voy a dar algunas buenas salida que le permite saber sio no todo era gratis. Practicaremos con él más adelantehoy, con suerte. >> Por último, el comando diff. Ha utilizado algo similar a ellaen pset5 con la herramienta vistazo. Le ha permitido observar el interior. También usaste diff, también, porel problema establece especificaciones. Pero en que permitecomparar dos archivos. Se podría comparar el archivo de mapa de bits yinfo encabezados de una solución personal y su solución en pset5 siopta por utilizarlo. Dif. le permitiráhacer eso, también. Puede comparar la respuesta correcta paraEl problema de esta semana establece en su respuesta y ver si se alinee o verdónde están los errores. >> Así que estos son tres buenas herramientas queusted debe utilizar para esta semana, y Definitivamente revisar su programa decon estas tres herramientas antes de dar vuelta pulg Una vez más, como ya he mencionado todas las semanas,si tiene alguna reacción para mí - tanto positiva y constructiva - no dude en dirigirse a la página weben la parte inferior de esta diapositiva y la entrada allí. Realmente aprecio cualquiery todos los comentarios. Y si me das las cosas específicas queQue puedo hacer para mejorar o que soy haciendo así que me gustaríaContinúo, me tomo muy a pecho y realmente se esfuerzan para escucharpara su regeneración. No puedo prometer que voy a hacertodo, sin embargo, como llevar una calabaza disfraz cada semana. >> Así que vamos a pasar la mayor parte desección, como ya he dicho, hablando de listas enlazadas y tablas hash, queserá directamente aplicable a la problema establecido esta semana. Las listas enlazadas vamos a repasar relativamenterápidamente, porque hemos pasado un poco justo de tiempo de ir sobre ella en la sección. Y así vamos a llegar directamente a laproblemas de codificación para listas enlazadas. Y luego, al final vamos a hablar detablas hash y cómo se aplican a este Problema de la semana. >> Usted ha visto este código antes. Esta es una estructura, y que está definiendoalgo nuevo llamado nodo. Y dentro de un nodo no es un enteroaquí y allá es un puntero a otro nodo. Hemos visto esto antes. Esto ha estado subiendo deun par de semanas ahora. Combina los punteros, que hemos estadotrabajar con, y estructuras, que permiten nos permite combinar dos diferentescosas en un solo tipo de datos. >> Hay mucho que hacer en la pantalla. Pero todo esto debe ser relativamentefamiliarizado con usted. En la primera línea, quedeclarar un nuevo nodo. Y luego, dentro de ese nuevo nodo, me puseel número entero en ese nodo a uno. Vemos en la siguiente línea que estoy haciendo unprintf comando, pero he atenuados el comando printf porque la verdadparte importante es esta línea aquí - new_node.n. ¿Qué significa el punto? >> AUDIENCIA: Vaya al nodo yevaluar el valor de n para ello. >> JASON HIRSCHHORN: Eso esexactamente correcto. Dot significa acceder a la parte nde este nuevo nodo. Esta línea siguiente hace qué? Michael. >> AUDIENCIA: Se crea otro nodoque se apunte al nuevo nodo. >> JASON HIRSCHHORN: Así que no hacecrear un nuevo nodo. Se crea un qué? >> AUDIENCIA: Un puntero. >> JASON HIRSCHHORN: Un puntero a un nodo,según lo indicado por este nodo * aquí. Por lo tanto, crea un puntero a un nodo. Y qué nodo se lo apuntaa, Michael? >> AUDIENCIA: Nuevo nodo? >> JASON HIRSCHHORN: Nuevo nodo. Y está apuntando allí porque hemosdado que la dirección del nuevo nodo. Y ahora en esta línea vemosdos maneras diferentes de expresar la misma cosa. Y yo quería señalar cómo estosdos cosas son lo mismo. En la primera línea, que eliminar la referenciael puntero. Así que vamos al nodo. Eso es lo que significa esta estrella. Hemos visto que antes con los punteros. Ir a ese nodo. Eso está en paréntesis. Y a continuación, acceder a través del operador de puntoel elemento n de ese nodo. >> Así que eso tomar la sintaxisvimos aquí y ahora usarla con un puntero. Por supuesto, se pone un poco ocupado siusted está escribiendo esos paréntesis - esa estrella y ese punto. Se pone un poco ocupado. Así que tenemos un poco de azúcar sintáctica. Y esta línea aquí - ptr_node-> n. Que hace exactamente lo mismo. Así que esas dos líneas de código sonequivalente y lo hará exactamente lo mismo. >> Pero yo quería señalar los antesde ir más lejos para que usted entienda que realmente esta cosa aquí essólo el azúcar sintáctica para eliminación de referencias el puntero y luego ir ala parte n de esa estructura. ¿Una pregunta sobre esta diapositiva? Aceptar. >> Así que vamos a ir a través de un parde las operaciones que se pueden hacer en listas enlazadas. Una lista enlazada, el recuerdo, es una serie denodos que apuntan el uno al otro. Y por lo general, comenzamos con un punterollamado la cabeza, por lo general, que apunta a lo primero en la lista. Así que en la primera línea aquí,tener primero el original L. Así que esa cosa que se pueda imaginar - estotexto aquí se puede pensar en como sólo el puntero hemos almacenadoen alguna parte que los puntos para el primer elemento. Y en esta lista enlazadatenemos cuatro nodos. Cada nodo es una caja grande. La caja más grande dentro de la grancaja es la parte entera. Y luego tenemos una parte puntero. >> Estas cajas no están dibujados aescala debido a lo grande que es un entero en bytes? ¿Qué tan grande ahora? Cuatro. Y qué tan grande es un puntero? Cuatro. Así que en realidad, si tuviéramos que dibujaresto es a escala ambas cajas sería el mismo tamaño. En este caso, queremos insertaralgo a la lista enlazada. Así que usted puede ver aquí abajo estamos insertandocinco Atravesamos a través de la lista enlazada, donde encontrará cincova, y luego insertarlo. >> Vamos a romper eso y vanun poco más lentamente. Voy a señalar a la junta. Así que tenemos nuestro nodo cinco quehemos creado en mallocs. ¿Por qué se está riendo de todo el mundo? Es broma. Aceptar. Así que hemos malloced cinco. Hemos creado este nodoen otro lugar. Nosotros lo tenemos listo para ir. Empezamos en la parte frontal denuestra lista con dos. Y queremos insertarde una manera ordenada. >> Así que si vemos a dos y queremos poneren cinco, ¿qué hacemos cuando vemos algo menos que nosotros? ¿Qué? Queremos insertar cinco en estelista enlazada, manteniéndolo ordenado. Vemos el número dos. Entonces, ¿qué hacemos? Marcus? >> AUDIENCIA: Llame al punteroal siguiente nodo. >> JASON HIRSCHHORN: ¿Y por quénos vamos a la siguiente? >> AUDIENCIA: Porque es lasiguiente nodo de la lista. Y sólo se sabe que otra ubicación. >> JASON HIRSCHHORN: Y cinco es mayorde dos, en particular. Porque queremos mantenerla ordenada. Así cinco es mayor que dos. Así que pasamos a la siguiente. Y ahora llegamos a cuatro. ¿Y qué pasa cuando lleguemos a cuatro? >> El cinco es mayor que cuatro. Así que seguimos adelante. Y ahora estamos a las seis. ¿Y qué es lo que vemos a las seis? Sí, Carlos? >> AUDIENCIA: Six es mayor que cinco. >> JASON HIRSCHHORN: Six esmayor que cinco. Así que ahí es donde queremospara insertar cinco. Sin embargo, tenga en cuenta que si nossólo tienen un puntero aquí - este es nuestro puntero extra que esatravesando por la lista. Y estamos apuntando a seis. Hemos perdido la pista de loviene antes de las seis. Así que si queremos insertar algo enesta lista mantenerla ordenada, que probablemente necesitará el número de punteros? >> AUDIENCIA: Dos. >> JASON Hirschhorn: Dos. Uno para realizar un seguimiento de la corrienteuno y uno para realizar un seguimiento de la anterior. Esta es sólo una lista vinculada individualmente. Sólo va en una dirección. Si tuviéramos una lista doblemente enlazada, dondetodo apuntaba a la cosa después de ella y la cosa antes de que, a continuación,no tendríamos necesidad de hacer eso. Pero en este caso no queremos perderun seguimiento de lo que hubo antes de nosotros en caso de tenemos que insertar cinco en alguna parteen el medio. Digamos que Insertamos nueve. ¿Qué pasaría cuandollegamos a las ocho? >> AUDIENCIA: Usted tendría queconseguir que el punto nulo. En lugar de tener punto nulo tendríaspara agregar un elemento y luego tener que apunte a nueve. >> JASON Hirschhorn: Exactamente. Así que tenemos ocho. Llegamos al final de la lista debido aesto apunta a null. Y ahora, en lugar de tener que apunte anula tenemos que apunte a nuestro nuevo nodo. Y ponemos el puntero ennuestro nuevo nodo en null. ¿Alguien tiene alguna preguntaacerca de la inserción? ¿Qué pasa si no se preocupan pormantener la lista ordenada? >> AUDIENCIA: Stick it en elprincipio o al final. >> JASON Hirschhorn: Pegúela enal principio o al final. ¿Cuál debemos hacer? Bobby? ¿Por qué al final? >> AUDIENCIA: Debido a que el principioya está lleno. >> JASON Hirschhorn: OK. El comienzo ya está lleno. ¿Quién quiere argumentar en contra de Bobby. Marcus. >> AUDIENCIA: Bueno, usted probablemente querrápegarlo al principio porque de lo contrario si usted lo pone enfinal que tendría que recorrer toda la lista. >> JASON Hirschhorn: Exactamente. Así que si estamos pensando en el tiempo de ejecución, latiempo de ejecución de la inserción en el extremo sería n, el tamaño de este. ¿Cuál es el tiempo de ejecución de O de inserciónpor el principio? Constante de tiempo. Así que si usted no se preocupan por manteneralgo ordenada, mucho mejor que sólo insertar al principio de esta lista. Y eso se puede hacer en tiempo constante. >> Aceptar. Operación siguiente se encontró que otros -hemos redactaron del búsqueda. Pero vamos a mirar a través de lalista enlazada por algún objeto. Ustedes han visto el código debuscar antes en la conferencia. Pero que tipo de sólo hicimos coninsertar, o al menos la inserción algo ordenada. Te ves a través, pasando por el nodo nodo,hasta que encuentre el número que usted está buscando. ¿Qué sucede si usted llega ael final de la lista? Digamos que yo estoy buscando a las nueve y mellegar al final de la lista. ¿Qué hacemos? >> AUDIENCIA: Volver falso? >> JASON Hirschhorn: Regresa falso. No nos encontrará. Si llega al final de la lista yque no encontró el número al que está buscando, no está allí. ¿Una pregunta sobre encontrar? Si se trataba de una lista ordenada, lo que haríaser diferente para nuestra búsqueda? Sí. >> AUDIENCIA: Se encontraría el primer valores mayor que el usted está buscando ya continuación, devolver false. >> JASON Hirschhorn: Exactamente. Así que si se trata de una lista ordenada, si llegamos aalgo que es más grande que lo que estamos buscando, nosotros no necesitamosseguir adelante hasta el final de la lista. Podemos en ese punto return falseporque no vamos a encontrar. La pregunta es ahora, hemos hablado demantener listas enlazadas ordenados, manteniéndolos sin clasificar. Eso va a ser algo que teprobablemente va a tener que pensar en cuando un problema de codificación establecido cinco sielegir una tabla hash con separada enfoque de encadenamiento, quehablaremos más tarde. >> Pero ¿vale la pena mantener la listaordenada y luego ser capaz de tener tal vez Búsquedas más rápidas? ¿O es mejor para insertar rápidamentealgo en tiempo de ejecución constante, pero luego tener más tiempo buscando? Eso es un compromiso justo ahí quellegar a decidir qué es lo más apropiado para su problema específico. Y no es necesariamente unarespuesta toda la razón. Pero sin duda es una decisión que usted obtienede hacer, y probablemente bueno para defender que en, digamos, un comentario o dos por quéque eligió una sobre la otra. >> Por último, la eliminación. Hemos visto borrar. Es similar a la búsqueda. Buscamos el elemento. Digamos que estamos tratando de eliminar seis. Así nos encontramos con seis aquí. Lo que tenemos que asegurarnos de quehacer es que todo lo que está apuntando a seis - como vemos en el pasodos aquí abajo - lo que sea que apunta a seis necesidades asaltar seis ahora y cambiar para cualquiera que sea seis está apuntando. No queremos dejar huérfano vez el resto denuestra lista por el olvido para establecer que puntero anterior. Y a continuación, a veces, dependiendoen el programa, ellos sólo eliminar este nodo completo. A veces usted querrá volverel valor que está en este nodo. Así es como la supresión de las obras. ¿Tiene preguntas sobre eliminar? >> AUDIENCIA: Así que si usted va a borrarél, sería simplemente usar gratis porque presumiblemente se malloced? >> JASON Hirschhorn: Si desea liberaralgo que es exactamente correcto y usted malloced ella. Digamos que queríamos volver a este valor. Podríamos volver seis y luego libreeste nodo y conexión de llamadas en él. O es probable que llamaríamos libre primeroy luego regresar seis. >> Aceptar. Así que vamos a pasar a la práctica de codificación. Vamos a codificar tres funciones. La primera se llama insert_node. Así que tienes el código que te envié, ysi estás viendo esto más adelante se puede acceder al código en linked.cen el sitio web CS50. Pero en linked.c, hay algo decódigo esqueleto que ya está ha escrito para usted. Y luego hay un par de funcionesque necesita para escribir. >> En primer lugar vamos aescribir insert_node. ¿Y qué hace insert_nodees decir inserta un entero. Y usted está dando el número enteroen una lista enlazada. Y, en particular, es necesariopara mantener la lista ordenada desde el más pequeño al más grande. Además, usted no quiereinserte los duplicados. Por último, como se puede ver insert_nodedevuelve un bool. Así que se supone que debes saber al usuariosi o no el inserto era éxito devolviendo verdadero o falso. Al final de este programa - y para esta etapa no es necesarioque preocuparse por la liberación de cualquier cosa. Así que todo lo que estamos haciendo es tomando un enteroe insertándolo en una lista. >> Eso es lo que te estoy pidiendo que hagas ahora. Una vez más, en el linked.c, que setodos tienen, es el código de esqueleto. Y hay que ver hacia el fondola declaración de la función de la muestra. Sin embargo, antes de entrar en la codificación queen C, yo le animo a ir a través de los pasos que hemos estadola práctica de cada semana. Nosotros ya hemos pasado poruna foto de esto. Así que usted debe tener algún conocimientode cómo funciona esto. Pero me animo a escribiralgunos pseudocódigo antes de sumergirse pulg Y vamos a repasarpseudocódigo como un grupo. Y una vez que has escrito tupseudocódigo, y una vez que hemos escrito nuestra pseudocódigo como grupo, puedeentrar en la codificación en C. >> Como un mano a mano, la función insert_nodees probablemente el más difícil de los tres que vamos a escribir porqueañadido algunas restricciones adicionales para su programación, en particular, queno vas a insertar cualquier duplicados y que la listadebe permanecer ordenado. Así que este es un programa no trivialque usted necesita para codificar. ¿Y por qué no te llevas seis y cincuenta y cincominutos, para simplemente trabajar en el pseudocódigo y el código. Y luego vamos a empezarir como un grupo. Una vez más, si usted tiene alguna pregunta sólolevantar la mano y voy a entrar en razón. . >> Nosotros también, en general hacemos estos - o yo no te digo explícitamentepuede trabajar con la gente. Pero, obviamente, yo le animo,si tiene preguntas, pedir al vecino sentado a tu ladoo incluso trabajar con alguien más si quieres. Este no tiene que ser un individuoactividad silenciosa. >> Vamos a empezar con la escritura de algunospseudocódigo en el tablero. ¿Quién me puede dar la primera línea depseudocódigo para este programa? Para esta función, en lugar -insert_node. Alden? >> AUDIENCIA: Así que lo primero que hice fuecrear un nuevo puntero al nodo y yo inicializa lo que apunta a la mismacosa que la lista está señalando. >> JASON Hirschhorn: OK. Así que va a crear un nuevo punteroa la lista, no para el nodo. >> AUDIENCIA: Así es. Sí. >> JASON Hirschhorn: OK. Y entonces, ¿qué es lo que queremos hacer? ¿Qué hay después de eso? ¿Qué pasa con el nodo? No tenemos un nodo. Sólo tenemos un valor. Si queremos insertar un nodo, lo que hace quenecesita hacer primero antes de que podamos siquiera pensar insertarlo? >> AUDIENCIA: Oh, lo siento. tenemos que malloc espacio para un nodo. >> JASON Hirschhorn: Excelente. Vamos a hacer - Aceptar. No se puede llegar tan alto. Aceptar. Vamos a ir hacia abajo, y luegoestamos usando dos columnas. No puedo ir a que - Aceptar. Crear un nuevo nodo. Puede crear otro puntero a la listao simplemente puede utilizar la lista, tal como existe. Usted realmente no necesita hacer eso. >> Así que creamos un nuevo nodo. Grande. Eso es lo que hacemos en primer lugar. ¿Qué sigue? >> AUDIENCIA: Espere. ¿Hay que crear un nuevo nodo ahora odebemos esperar para asegurarse de que no hay duplicados del nodoen la lista antes de que nos lo creamos? >> JASON Hirschhorn: Buena pregunta. Vamos a sostener que para más adelante porque elmayor parte del tiempo estaremos creando un nuevo nodo. Así que vamos a seguir eso aquí. Pero esa es una buena pregunta. Si creamos y nos encontramosun duplicado, lo que debe que hacemos antes de regresar? >> AUDIENCIA: liberarlo. >> JASON Hirschhorn: Si. Probablemente liberarlo. Aceptar. ¿Qué hacemos después de quecrear un nuevo nodo? Annie? >> AUDIENCIA: Ponemos lanúmero en el nodo? >> JASON Hirschhorn: Exactamente. Ponemos el número - que malloc espacio. Voy a dejar quetodo en una sola línea. Pero tienes razón. Nos malloc espacio, y luegoponemos el número pulg Incluso podemos establecer el punteroparte de ella en null. Eso es exactamente correcto. Y entonces ¿qué pasa después de eso? Dibujamos la imagen en el tablero. Entonces, ¿qué hacemos? >> AUDIENCIA: Vamos a través de la lista. >> JASON Hirschhorn: Ir a través de la lista. Aceptar. ¿Y qué vamos a comprobar en cada nodo. Kurt, ¿qué es lo comprobamospara en cada nodo? >> AUDIENCIA: Ver si el valor de n deese nodo es mayor que el valor de n de nuestro nodo. >> JASON Hirschhorn: OK. Yo voy a hacer - Sí, está bien. Así que es n - Yo voy a decir si el valor es mayorde este nodo, entonces, ¿qué hacemos? >> AUDIENCIA: Bueno, entonces nos insertamoslo correcto antes de eso. >> JASON Hirschhorn: OK. Así que si es mayor que este,entonces queremos insertar. Pero queremos insertar justo antes deporque nosotros también necesitamos ser hacer el seguimiento y, a continuación,de lo que era antes. Así que insertar antes. Así que es probable que perdimos algoanteriormente. Probablemente necesitemos estar manteniendoun seguimiento de lo que está pasando. Pero vamos a llegar allí. Entonces, ¿qué valor es inferior? Kurt, ¿qué hacemos sivalor es menor que? >> AUDIENCIA: A continuación, sólo seguir adelantea menos que sea el último. >> JASON Hirschhorn: eso me gusta. Así que ir al siguiente nodo. A menos que sea el último - es probable que estamos comprobando queen los términos de una condición. Pero sí, el próximo nodo. Y eso no baje mucho,así que vamos a pasar por aquí. Pero si - ¿Todos pueden ver esto? Si somos iguales, ¿qué hacemos? Si el valor que estamos tratando de insertares igual al valor de este nodo? ¿Sí? >> AUDIENCIA: [inaudible]. >> JASON Hirschhorn: Si. Dada esta - Marcus tiene razón. Podríamos haber hecho tal vezalgo diferente. Pero teniendo en cuenta que hemos creado, aquídebemos liberar y luego regresar. Oh boy. ¿Así está mejor? ¿Cómo es eso? Aceptar. Gratis y entonces, ¿qué hacemos nosotrosdevolver, [inaudible]? Aceptar. ¿Nos estamos perdiendo algo? Entonces, ¿dónde hacer el seguimientodel nodo antes? >> AUDIENCIA: Creo que sería irdespués de crear un nuevo nodo. >> JASON Hirschhorn: OK. Así que al principio probablemente vamos - sí, podemos crear un puntero a una nuevanodo, como un puntero de nodo anterior y un puntero nodo actual. Así que vamos a insertar eso aquí. Crear actual y anteriorpunteros a los nodos. Pero ¿cuándo nos ajustamos los punteros? ¿Dónde lo hacemos en el código? Jeff? >> AUDIENCIA: - condiciones de valor? >> JASON Hirschhorn: ¿Quéuno en particular? >> AUDIENCIA: Estoy confundido. Si el valor es superior a este nodo,¿eso no significa que usted quiere ir al siguiente nodo? >> JASON HIRSCHHORN: Así que si nuestro valor esmayor que el valor de este nodo. >> AUDIENCIA: Sí, entonces lo que quiereir más abajo de la línea, ¿no? >> JASON HIRSCHHORN: Así es. Así que no insertamos aquí. Si el valor es inferior a este nodo, a continuación,vamos al siguiente nodo - o entonces insertar antes. >> AUDIENCIA: Espera, que es estenodo y que es el valor? >> JASON HIRSCHHORN: Buena pregunta. Valor por esta definición de funciónes lo que se nos da. Así que el valor es el número que se nos da. Así que si el valor es menor que estenodo, necesitamos tiempo para insertar. Si el valor es superior a este nodo,vamos al siguiente nodo. Y volviendo a la pregunta original,sin embargo, donde - >> AUDIENCIA: Si el valor es mayorde este nodo. >> JASON HIRSCHHORN: Y así¿qué hacemos aquí? Sweet. Eso es correcto. Yo sólo voy a escribirpunteros de actualización. Pero eso sí, con la actualusted desea actualizar a apuntar a la siguiente. Cualquier otra cosa que se está perdiendo? Así que voy a escribir estocódigo en gedit. Y mientras hago esto, usted puede tener unapar de minutos más para trabajar en la codificación esta en C. >> Así que tengo que ingresar el pseudocódigo. Una nota rápida antes de empezar. Puede que no seamos capaces de completamenteterminar esto en todo tres de estas funciones. Hay soluciones correctas a losque voy a enviar por correo electrónico a ustedes después de la sección, y lo haráse publicarán en CS50.net. Así que no os animo air a buscar en las secciones. Te animo a que intente resolverlo ustedposeer, y luego usar el la práctica problemas para comprobar sus respuestas. Todas ellas han sido diseñadas para cercarelacionarse y cumplir con lo lo que tienes que hacer en el conjunto de problemas. Así que te animo a practicar estepor su cuenta y luego usar el código para compruebe sus respuestas. Porque quiero seguir adelante para discutirmesas en algún punto de la sección. Así que podríamos no conseguir en todo momento. Pero vamos a hacer lo más que podamos ahora. >> Aceptar. Comencemos. Asam, ¿cómo creamos un nuevo nodo? >> AUDIENCIA: Usted struct *. >> JASON HIRSCHHORN: Así quetener que hasta aquí. Oh, lo siento. ¿Decías struct *. >> AUDIENCIA: Y luego [? tipo?]nodo o nodo c. >> JASON HIRSCHHORN: OK. Voy a llamarlo new_nodepara que podamos permanecer constante. >> AUDIENCIA: Y usted desea establecer quea la cabeza, el primer nodo. >> JASON HIRSCHHORN: OK. Así que ahora esta apuntando a - por lo que esteno ha creado un nuevo nodo aún. Esto es sólo apunta a laprimer nodo en la lista. ¿Cómo se crea un nuevo nodo? Si necesito espacio para crear un nuevo nodo. Malloc. Y qué tan grande? >> AUDIENCIA: El tamaño de la estructura. >> JASON HIRSCHHORN: Eltamaño de la estructura. Y ¿cuál es la estructura llamada? >> AUDIENCIA: Nodo? >> JASON HIRSCHHORN: Nodo. Así malloc (sizeof (nodo));nos da el espacio. Y es esta línea - una cosa es incorrecto en esta línea. Es new_node un puntero a una estructura? Es un nombre genérico. Qué es - nodo, exactamente. Es un nodo *. Y, ¿qué hacemos despuésque malloc algo, Asan? ¿Qué es lo primero que vamos a hacer? ¿Qué pasa si no funciona? >> AUDIENCIA: Oh, compruebe siapunta al nodo? >> JASON HIRSCHHORN: Exactamente. Así que si usted new_node iguales igualesnulo, ¿qué hacemos? Esto devuelve un bool, esta función. Exactamente. Se ve bien. Cualquier cosa para agregar ahí? Vamos a añadir cosas al final. Pero que hasta el momento se ve bien. Crear indicadores actuales y anteriores. Michael, ¿cómo puedo hacer esto? >> AUDIENCIA: Usted tendríahacer un nodo *. Tendrías que lo hace a unopara new_node pero para la nodos que ya tienen. >> JASON HIRSCHHORN: OK. Así que el nodo actual estamos en. Voy a llamar a ese curr. Está bien. Hemos decidido que queremos mantenerdos, porque tenemos que saber lo que hay antes de ella. ¿Qué son inicializadas a? >> AUDIENCIA: Su valor en nuestra lista. >> JASON HIRSCHHORN: Entonces, ¿cuál es elLo primero en nuestra lista? O, ¿cómo sabemos que ela partir de nuestra lista es? >> AUDIENCIA: ¿No se aprobóen la función de? >> JASON HIRSCHHORN: Así es. Se aprobó en aquí. Así que si se pasa a la función, lainicio de la lista, ¿qué debemos establecer corriente igual a? >> AUDIENCIA: Lista. >> JASON HIRSCHHORN: Lista. Eso es exactamente correcto. Ahora que tiene la dirección deel principio de nuestra lista. Y ¿qué pasa con previa? >> AUDIENCIA: Lista menos uno? >> JASON HIRSCHHORN: Nonada antes de ella. Entonces, ¿qué podemos hacer para significar nada? >> AUDIENCIA: Nulo. >> JASON HIRSCHHORN: Si. Eso suena como una buena idea. Perfect. Gracias. Ir a través de la lista. Constantino, ¿cuánto tiempo vamosque pasar por la lista? >> AUDIENCIA: hasta llegar a nulo. >> JASON HIRSCHHORN: OK. Así que si, mientras que, para el bucle. ¿Qué estamos haciendo? >> AUDIENCIA: Tal vez un bucle? >> JASON HIRSCHHORN: Vamos a hacer un bucle for. Aceptar. >> AUDIENCIA: Y decimos por - hasta que el puntero actualno es igual a nulo. >> JASON HIRSCHHORN: Así que si conocemos lacondiciones, ¿cómo podemos escribir un bucle con sede fuera esa condición. ¿Qué clase de un bucle debemos utilizar? >> AUDIENCIA: While. >> JASON HIRSCHHORN: Si. Eso tiene más sentido con basefuera de lo que dijiste. Si sólo queremos ir a que lo haríasólo sé que cosa, tendría sentido hacer un bucle while. Mientras que la corriente no es igual a null,si el valor es inferior a este nodo. Akshar, dame de esa línea. >> AUDIENCIA: Si current-> nn menos de su valor. O revertir eso. Cambie esa franja. >> JASON HIRSCHHORN: Lo siento. >> AUDIENCIA: Cambie el soporte. >> JASON HIRSCHHORN: Así que si esmayor que el valor. Porque eso es confuso con lacomente anteriormente, voy a hacer eso. Pero sí. Si nuestro valor es menor que estenodo, ¿qué hacemos? Oh. Lo tengo aquí mismo. Insertar antes. Aceptar. ¿Cómo hacemos eso? >> AUDIENCIA: ¿Sigue siendo mi? >> JASON HIRSCHHORN: Si. >> AUDIENCIA: Usted - new_node-> siguiente. >> JASON HIRSCHHORN: Entonces, ¿quéque va a ser igual? >> AUDIENCIA: Va a la misma corriente. >> JASON HIRSCHHORN: Exactamente. Y así, el otro - lo que más necesitamos para actualizar? >> AUDIENCIA: Compruebe si el pasado es igual a nulo. >> JASON HIRSCHHORN: Si prev - por lo que si es igual prev nulo. >> AUDIENCIA: Eso significa que vapara convertirse en la cabeza. >> JASON HIRSCHHORN: Eso significase ha convertido en la cabeza. Entonces, ¿qué hacemos? >> AUDIENCIA: Hacemos la cabeza es igual new_node. >> JASON HIRSCHHORN: Headiguales new_node. ¿Y por qué la cabeza aquí, no lista? >> AUDIENCIA: Debido a que la cabeza es un mundialvariable, que es el punto de partida. >> JASON HIRSCHHORN: Sweet. Aceptar. Y - >> AUDIENCIA: Entonces, ¿los demás prev->siguiente es igual new_node. Y luego puede volver realidad. >> JASON HIRSCHHORN: ¿Dóndenos pusimos fin new_node? >> AUDIENCIA: yo - Me puse de que al comienzo. >> JASON HIRSCHHORN: Entonces, ¿qué línea? >> AUDIENCIA: Después de la sentencia ifcomprobar si se sabe. >> JASON HIRSCHHORN: ¿Aquí mismo? >> AUDIENCIA: Haría new_node-> nigual valor. >> JASON HIRSCHHORN: Suena bien. Probablemente tiene sentido - no lo hacemosnecesita saber lo que la lista que estamos en porque sólo estamos tratandocon una sola lista. Por lo tanto una mejor declaración de la función deesto es sólo para deshacerse de este por completo y sólo tiene que insertarun valor en la cabeza. Ni siquiera necesitamos saberlo lista que estamos metidos Pero voy a mantener todo por ahora yluego cambiar a la actualización las diapositivas y código. Así que se ve bien, por ahora. Si el valor - que puede hacer esta línea? Si - ¿qué hacemos aquí, Noah. >> AUDIENCIA: Si el valor es mayorde curr-> n - >> JASON HIRSCHHORN: ¿Cómovamos al siguiente nodo? >> AUDIENCIA: Curr-> n esigual a new_node. >> JASON HIRSCHHORN: Entonces n esqué parte de la estructura? El número entero. Y new_node es un puntero a un nodo. Entonces, ¿qué parte de curr debemos actualizar? Si no es n, entonces ¿cuál es la otra parte? Noé, ¿cuál es la otra parte. >> AUDIENCIA: Oh, la próxima. >> JASON HIRSCHHORN: A continuación, exactamente. Exactamente. Siguiente es la correcta. Y lo que más necesitamosactualizar, Noah? >> AUDIENCIA: Los punteros. >> JASON HIRSCHHORN: Asíactualizamos actual. >> AUDIENCIA: Anterior-> siguiente. >> JASON HIRSCHHORN: Si. Bien, vamos a hacer una pausa. ¿Quién nos puede ayudar? Manu, ¿qué debemos hacer? >> AUDIENCIA: Hay que estableceres igual a curr-> siguiente. Pero hacer eso antes de la línea anterior. >> JASON HIRSCHHORN: OK. ¿Algo más? Akshar. >> AUDIENCIA: Creo que no estásla intención de cambiar curr-> siguiente. Creo que estás destinado a hacer iguales currcurr-> siguiente para ir al siguiente nodo. >> JASON HIRSCHHORN: Lo siento, ¿dónde? ¿En qué línea? Esta línea? >> AUDIENCIA: Si. Hacer curr equivale curr-> siguiente. >> JASON HIRSCHHORN: Así que eso es correctoporque la corriente es una puntero a un nodo. Y queremos que apunte a la siguientenodo de lo que está recibiendo en la actualidad señalado. Curr en sí tiene un siguiente. Pero si tuviéramos que actualizar curr.next, nossería la actualización de la nota real en sí, no donde estapuntero señalaba. ¿Qué pasa con esta línea, sin embargo. Avi? >> AUDIENCIA: Anterior-> siguiente es igual curr. >> JASON HIRSCHHORN: Así que de nuevo, en caso anterior es unpuntero a un nodo, anterior-> siguiente es la puntero actual en el nodo. Así que esta sería la actualización de unapuntero en un nodo para curr. No queremos poner al díaun puntero en un nodo. Queremos poner al día anterior. Entonces, ¿cómo hacemos eso? >> AUDIENCIA: Sólo se prev. >> JASON HIRSCHHORN: Así es. Anterior es un puntero a un nodo. Ahora vamos a cambiar a unnuevo puntero a un nodo. Aceptar Movámonos hacia abajo. Finalmente, esta última condición. Jeff, ¿qué hacemos aquí? >> AUDIENCIA: Si el valor esigual a curr-> n. >> JASON HIRSCHHORN: Lo siento. ¡Oh Dios mío. ¿Qué? Valor == curr-> n. ¿Qué hacemos? >> AUDIENCIA: Usted sería liberar a nuestros new_node,y luego te volverías falsa. >> JASON HIRSCHHORN: Esto es lo queque hemos escrito hasta ahora. ¿Alguien tiene algoañadir antes de que hagamos? Aceptar. Vamos a intentarlo. El control puede llegar a la finalde una función no nula. Avi, ¿qué está pasando? >> AUDIENCIA: ¿Se supone que poner de retornocierto fuera del bucle while? >> JASON HIRSCHHORN: No sé. ¿Me quieres? >> AUDIENCIA: No importa. No. >> JASON HIRSCHHORN: Akshar? >> AUDIENCIA: Creo que la intención deponer return false al final del bucle while. >> JASON HIRSCHHORN: Entonces, ¿dóndeQué quieres que vaya? >> AUDIENCIA: Al igual que fuera del bucle while. Así que si sale del bucle while que los mediosque ha llegado al final y no ha pasado nada. >> JASON HIRSCHHORN: OK. Así que, ¿qué hacemos aquí? >> AUDIENCIA: Usted vuelve falsaallí también. >> JASON HIRSCHHORN: Oh,hacerlo en ambos lugares? >> AUDIENCIA: Si. >> JASON HIRSCHHORN: OK. ¿Hay que ir? ¡Oh Dios mío. Lo siento. Pido disculpas por la pantalla. Es un poco flipando en nosotros. Así que debes elegir una opción. Cero, por el código, se cierra el programa. Uno inserta algo. Vamos a insertar tres. El inserto no tuvo éxito. Voy a imprimir. Yo no tengo nada. Aceptar. Tal vez eso era sólo una casualidad. Inserte uno. No éxito. Aceptar. Vamos a ejecutar a través de GDB muy rápidopara comprobar lo que está pasando. >> Recuerde gdb. / El nombre de suprograma nos mete en el BGF. ¿Es que una gran cantidad de manejar? El intermitente? Probablemente. Cierra los ojos y tomar un poco de profundidadrespiraciones si te cansas de ver las cosas. Estoy en el BGF. ¿Qué es lo primero que hago en GDB? Tenemos que averiguar¿qué está pasando aquí. Vamos a ver. Tenemos seis minutos de la figuralo que está pasando. Romper principal. Y entonces, ¿qué hago? Carlos? Ejecutar. Aceptar. Vamos a escoger una opción. ¿Y qué tiene N hacer? Siguiente. Sí. >> AUDIENCIA: ¿No lo dices - qué no me dijiste que la cabeza, que erainicializa en null al principio. Pero pensé que habías dicho que estaba bien. >> JASON HIRSCHHORN: Vamos - vamos a veren GDB, y luego vamos a volver. Pero parece que usted ya tienealgunas ideas sobre lo que está pasando. Así que queremos insertar algo. Aceptar. Hemos insertar. Por favor ingrese un int. Nosotros insertaremos tres. Y entonces estoy en esta línea. ¿Cómo hago para iniciar la depuraciónla inserción de la función conocida? ¡Oh Dios mío. Eso es un montón. ¿Eso enloqueciendo mucho? >> AUDIENCIA: Oh, murió. >> JASON HIRSCHHORN: Acabolo sacó. Aceptar. >> AUDIENCIA: Tal vez sea elotro extremo del cable. >> JASON HIRSCHHORN: Wow. Así que la conclusión - ¿qué le dijiste? >> AUDIENCIA: Dije que la ironía de la técnicadificultades en esta clase. >> JASON HIRSCHHORN: Lo sé. Si tan sólo tuviera el control sobre esa parte. [Inaudible] Eso suena muy bien. ¿Por qué no empezar a pensar en los chicoslo que podríamos haber hecho mal, y vamos a estar de vuelta en 90 segundos. >> Avica, voy a preguntarle cómo irinsert_node interior para depurarlo. Así que aquí es donde nos dejó la última vez. ¿Cómo me voy adentro insert_node, Avica,examinar lo que está pasando? ¿Qué comando GDB? Pausa no me llevaría en su interior. ¿Lo sabe Marquise? >> AUDIENCIA: ¿Qué? >> JASON HIRSCHHORN: ¿Qué comando GDBYo uso para ir dentro de esta función? >> AUDIENCIA: Step? >> JASON HIRSCHHORN: Paso a través deS. Eso me lleva dentro. Aceptar. New_node mallocing algo de espacio. Todo eso parece que va. Vamos a examinar new_node. Se puso un poco de dirección de memoria. Vamos a ver - eso es todo lo correcto. Así que todo lo que aquí pareceestar funcionando correctamente. >> AUDIENCIA: ¿Cuál es la diferenciaentre P y la pantalla? >> JASON HIRSCHHORN: P corresponde a la impresión. Y por lo que se está preguntando cuál es ladiferencia entre eso y esto? En este caso, nada. Pero generalmente hayalgunas diferencias. Y usted debe buscar en el manual de GDB. Pero en este caso, nada. Tenemos la tendencia a utilizar la impresión, sin embargo, porquenosotros no tenemos que hacer mucho más que imprimir un solo valor. >> Aceptar. Así que estamos en la línea 80 de nuestro código,estableciendo nodo * curr igual a lista. Vamos a imprimimos curr. Es igual a la lista. Sweet. Espere. Es igual a algo. Eso no me parece correcto. Eso es. Es porque en GDB, bien, sique es la línea que está en él aún no se ha ejecutado. Así que hay que escribir en realidadsiguiente para ejecutar la línea de antes de ver sus resultados. Así que aquí estamos. Simplemente ejecuta esta línea,anterior equivale a nula. Así que de nuevo, si imprimimos anteriorno vamos a ver nada raro. Pero si realmente ejecutan a quelínea, entonces veremos que esa línea funcionó. >> Así que tenemos curr. Esos son los dos buenos. ¿Cierto? Ahora estamos en esta línea aquí. Mientras curr no es igual a nulo. Bueno, lo que hace curr iguales? Acabamos de ver que igualó nulo. Imprimimos a cabo. Voy a imprimir hacia fuera otra vez. Así es que mientras que bucleva a ejecutar? >> AUDIENCIA: No. >> JASON HIRSCHHORN: Así que cuando he escrito quelínea, verá que saltó todo el camino hasta la parte inferior, devolverá false. Y luego vamos a devolver falsey volver a nuestro programa y finalmente, imprimir, como vimos,el inserto no tuvo éxito. Por lo tanto, nadie tiene alguna idea sobre lo queque tenemos que hacer para arreglar esto? Voy a esperar hasta que veaun par de manos suben. No ejecutamos esto. Tenga en cuenta que esta fue la primeraLo que estábamos haciendo. Yo no voy a hacer un par. Voy a hacer algunos. Debido a que un par significa dos. Voy a esperar por más de dos. >> La primera inserción, corr,por defecto es igual a nulo. Y este ciclo sólo se ejecutasi curr no es nulo. Entonces, ¿cómo puedo solucionar esto? Veo tres manos. Voy a esperar por más de tres. Marcus, ¿qué te parece? >> AUDIENCIA: Bueno, si usted lo necesitaejecutar más de una vez, sólo cambiarlo a un bucle do-while. >> JASON HIRSCHHORN: OK. ¿Será que resolver nuestro problema, sin embargo? >> AUDIENCIA: En este caso no, porque deel hecho de que la lista está vacía. Así que es probable que sólo necesita añadiruna declaración de que si se sale del bucle entonces usted tiene que estar al final de lala lista, momento en el que usted sólo puede insertarlo. >> JASON HIRSCHHORN: eso me gusta. Eso tiene sentido. Si se sale del bucle - porque va a devolver false aquí. Así que si se sale del bucle, entonces estamos enAl final de la lista, o tal vez el inicio de una lista si no hay nada en, lo que es lo mismo que el final. Así que ahora queremos insertaralgo aquí. Entonces, ¿cómo ese código mira, Marcus? >> AUDIENCIA: Si ya tienes el nodomalloced, usted podría decir new_node-> siguiente es igual a nula porquetiene que ser al final. O new_node-> siguiente es igual a nulo. >> JASON HIRSCHHORN: OK. Lo siento. New_node-> siguiente es igual a nulaporque estamos en el final. Eso no lo puso pulg ¿Cómo nos ponemos en la lista? Derecha. Eso es sólo la creación es igual a. No, ¿cómo en realidadlo puso en la lista? Lo que apunta a lafinal de la lista? >> AUDIENCIA: Head. >> JASON HIRSCHHORN: ¿Lo sientes? >> AUDIENCIA: Head está apuntandoal final de la lista. >> JASON HIRSCHHORN: Si no hay nada enla lista, la cabeza está apuntando a la final de la lista. Así que eso funcionará para laprimera inserción. ¿Qué pasa si hay un parlas cosas en la lista? Que no queremos establecercabeza igual a new_node. ¿Qué es lo que queremos hacer allí? ¿Sí? Probablemente anterior. ¿Funcionará? Recordemos que anterior es sóloun puntero a un nodo. Y anterior es una variable local. Así que esta línea creará una variable local,anterior, igual o señalando a este nuevo nodo. Eso no va a poner realmente seen la lista, sin embargo. ¿Cómo nos ponemos en nuestra lista? Akchar? >> AUDIENCIA: Creo quehacer actual-> siguiente. >> JASON HIRSCHHORN: OK. curr-> siguiente. Así que de nuevo, la única razón por la que estamos abajoaquí es lo que hace de corriente igual? >> AUDIENCIA: igual a nulo. >> JASON HIRSCHHORN: Y así loque pasa si lo hacemos nula-> next? ¿Qué va a conseguir? Conseguiremos un fallo de segmentación. >> AUDIENCIA: Do curr equivale a nula. >> JASON HIRSCHHORN: Eso es lo mismocomo anterior, sin embargo, porque no hay una variable local que estamos estableciendoigual a este nuevo nodo. Volvamos a nuestra imagende insertar algo. Digamos que estamos insertando al finalde la lista, por lo que aquí. Tenemos un puntero actual que esapuntando a null y un punto anterior eso apunta a 8. Entonces, ¿qué tenemos que actualizar, Avi? >> AUDIENCIA: Anterior-> siguiente? >> JASON HIRSCHHORN: Anterior-> siguiente es lo quequeremos poner al día a causa de que en realidad se inserta enel final de la lista. Todavía tenemos un bicho, sin embargo,que vamos a ejecutar en. ¿Qué es ese bicho? ¿Sí? >> AUDIENCIA: Se va a volverfalsa en este caso? >> JASON HIRSCHHORN: Oh, es que seva a devolver false. Pero hay otro bug. Así que tendremos que poner a cambio verdadero. >> AUDIENCIA: Lo anterior sigue igualnulo en la parte superior de la lista? >> JASON HIRSCHHORN: Todavía Así anteriores igual a nulo desde el principio. Entonces, ¿cómo podemos superar eso? ¿Sí? >> AUDIENCIA: Creo que se puede hacer una verificaciónantes de que el bucle while para ver si es una lista vacía. >> JASON HIRSCHHORN: OK. Así que vamos a ir aquí. Haga una revisión. Si - >> AUDIENCIA: Así que si la cabezaes igual a es igual a nulo. >> JASON HIRSCHHORN: Si la cabezaes igual a es igual a nula - que nos dirá si se trata de una lista vacía. >> AUDIENCIA: Y entonces ustedhacer la cabeza es igual a nuevo. >> JASON HIRSCHHORN: Headiguales new_node? Y ¿qué más tenemos que hacer? >> AUDIENCIA: Y luego puede volver realidad. >> JASON HIRSCHHORN: No del todo. Nos falta un paso. >> AUDIENCIA: New_node siguientetiene que apuntar a null. >> JASON HIRSCHHORN: Exactamente, Alden. Y entonces podemos devolver true. Aceptar. Pero sigue siendo una buena idea de hacer las cosasal final de la lista, ¿no? Está bien. Todavía podríamos conseguir realmenteal final de la lista. Así es este código bien si estamos en elfinal de la lista y hay algunos las cosas en la lista? ¿Cierto? Debido a que todavía tenemos idea de Marcus. Podemos salir de este bucle, porqueestamos en el final de la lista. Entonces, ¿todavía queremos estecódigo aquí abajo? >> AUDIENCIA: Si. >> JASON HIRSCHHORN: Si. Y ¿qué es lo que tenemos que cambiar esto? Verdadero. ¿Suena biena todo el mundo hasta el momento? ¿Alguien tiene alguna - Avi, ¿tienes algo que añadir? >> AUDIENCIA: No. >> JASON HIRSCHHORN: OK. Así que hemos hecho un par de cambios. Hemos hecho esta comprobación antes de quefuimos para una lista vacía. Así que nos hemos ocupado de una lista vacía. Y aquí nos ocupamos de la inserciónalgo al final de la lista. Así que parece que esta toma de bucle whilecuidado de las cosas en el medio, en algún lugar de la lista si hayson las cosas en la lista. >> Aceptar. Corramos este programa de nuevo. No éxito. >> AUDIENCIA: Usted no lo hacen. >> JASON HIRSCHHORN: Oh,Yo no lo hice. Buen punto, Michael. Vamos a añadir una marca vinculada. Línea 87 hay un error. Línea 87. Alden, esta fue la línea que me diste. ¿Qué pasa? >> AUDIENCIA: Tiene que ser null. >> JASON HIRSCHHORN: Excelente. Exactamente derecha. Debe ser nulo. Vamos a hacer de nuevo. Compilar. Aceptar. Vamos a insertar tres. El inserto fue exitosa. Vamos a imprimir hacia fuera. Oh, si tan sólo pudiéramos comprobar. Pero no hemos hecho loimprimir función todavía. Nos adentraremos en otra cosa. ¿Qué debemos entrar? >> AUDIENCIA: Siete. >> JASON HIRSCHHORN: Seven? >> AUDIENCIA: Si. >> JASON HIRSCHHORN: Tenemos una falla seg. Así que nos dieron una, pero claramenteno puede conseguir dos. Es 05:07. Así que podemos depurar estedurante tres minutos. Pero yo voy a dejarnos aquíy pasar a tablas hash. Pero, de nuevo, las respuestas de este códigoVoy a enviar por correo electrónico a usted en un momento. Estamos muy cerca de ella. Yo le animo a descubrir¿qué está pasando aquí y arreglarlo. Así que voy a por correo electrónico este código comoasí más la solución - probablemente la solución más adelante. En primer lugar este código. >> La otra cosa que quiero hacer antes de quefinal es que no hemos liberado a nada. Así que quiero que le muestre lovalgrind parece. Si corremos límites valgrinden nuestro programa. / enlazado. Una vez más, de acuerdo con esta diapositiva, nosdebe ejecutar valgrind con algún tipo de opción, en este caso- Fuga-check = full. Así que vamos a escribir valgrind- Fuga-check = full. Así que esto va a funcionar valgrinden nuestro programa. Y ahora el programa realmente funciona. Así que vamos a ejecutarlo comoantes, poner algo pulg Me voy a poner en tres. Eso funciona. No voy a tratar de poner en algomás porque vamos a conseguir un falso seg en ese caso. Así que sólo voy a dejar de fumar. >> Y ahora que se ve aquí abajofugas y resumen montón. Estas son las cosas buenas quedesea revisar. Así que el resumen del montón - dice, en usoen la salida - ocho bytes en un bloque. Ese bloque es elnodo que malloced. Michael, dijo antes de un nodo es de ochopicaduras porque tiene el número entero y el puntero. Así que ese es nuestro nodo. Y luego dice que usamos mallocsiete veces y nos liberamos algo en seis ocasiones. Pero nunca se llama libre, así que no tengoidea de lo que está hablando. >> Pero baste decir que cuando suprograma se ejecuta, malloc se está llamando en algunos otros lugares queno es necesario preocuparse. Así malloc probablemente fue llamadoen algunos lugares. Nosotros no tenemos que preocuparnos dónde. Pero esto es realmente nosotros. Esta primera línea es nosotros. Salimos de ese bloque. Y se puede ver que aquíen el resumen de fugas. Aún alcanzable - ocho bytes en un bloque. Eso significa que la memoria - hemos escapado ese recuerdo. Definitivamente perdido - algo se pierde para siempre. En general, no lo harásver nada allí. Todavía puede llegar es generalmente dondeverás las cosas, donde querrá que mirar para ver qué código debe ustedse han liberado pero se olvidó de liberar. >> Y luego, si este no era el caso,si lo hiciéramos todo gratis, podemos comprobar eso. Vamos a ejecutar el programano poner en cualquier cosa. Usted verá aquí en uso en la salida - cero bytes en cero bloques. Eso significa que ya no tenía nadacuando este programa se cierra. Así que antes de dar vuelta en pset6, valgrind ejecutary asegúrese de que usted no tiene cualquier pérdidas de memoria en su programa. Si usted tiene alguna pregunta con valgrind,no dude en acercarse. Pero esto es cómo lo usa. Muy sencillo - si ustedtener en uso en la salida - cualquier byte en cualquier bloque. >> Así que estábamos trabajando en el nodo de inserción. Tenía otras dos funciones aquí -imprimir los nodos y los nodos libres. Una vez más, se trata de funciones que sonva a ser bueno para que practiques ya que le ayudará no sólo conestos ejercicios de muestra, sino también en el conjunto de problemas. Se corresponden en muy de cerca a las cosasusted va a tener que hacer en el establece problema. Pero yo quiero estar seguroTocamos todo. Y las tablas hash también son cruciales paralo que estamos haciendo en la sección de este semana - o en el conjunto de problemas. >> Así que vamos a terminar la secciónhablando de las tablas hash. Si usted nota que hice unapequeña tabla hash. Eso no es lo que estamos hablandosobre, sin embargo. Estamos hablando de un diferentetipo de tablas hash. Y en el fondo, una tabla hashno es más que una gama más una función hash. Vamos a hablar un poco sólo paraasegúrese de que todo el mundo entiende lo que es un función hash es. Y te estoy diciendo ahora que esnada más que dos cosas - una matriz y una función hash. Y estos son los pasos a través deque esta opera. >> Ahí está nuestra matriz. Ahí está nuestra función. En particular, las funciones de hash necesitanhacer un par de cosas con esto. Voy a hablar específicamenteacerca establece este problema. Probablemente va atomar en una cadena. Y ¿qué va a volver? ¿Qué tipo de datos? Alden? Devuelva su función hash? Un entero. Así que esto es lo que el hashtabla consta de - una mesa en forma de matrizy una función de hash. ¿Cómo funciona? Funciona en tres pasos. Le damos una clave. En este caso, vamos a darle una cadena. Llamamos a la función hash por el paso unoen la llave y obtenemos un valor. >> En concreto, vamos a decirobtenemos un número entero. Ese número entero, no son muy específicoslímites a lo que puede ser entero. En este ejemplo, nuestra matrizes de tamaño tres. Entonces, ¿qué números puede ser ese entero. ¿Cuál es el rango de valores válidos paraese entero, el tipo de retorno de esta función hash? Cero, uno y dos. El punto de la función hash esaveriguar el lugar de la matriz donde la llave va. Sólo hay tres posibleslugares aquí - cero, uno, o dos. Así que esta función mejor retornocero, uno, o dos. Algunos indice válida en este array. >> Y a continuación, dependiendo de donde vuelve,se puede ver que hay antena abierta entre paréntesis el valor. Ahí es donde ponemos la clave. Así que tiramos a la calabaza,salgamos cero. En conjunto soporte 0, ponemos calabaza. Nos tiramos en los gatos, tenemos a uno. Ponemos en un gato. Ponemos en araña. Salimos dos. Ponemos araña en conjunto soporte de dos. Sería muy bueno sifuncionó de esa manera. Pero, por desgracia, como veremos,que es un poco más complicado. >> Antes de llegar allí, cualquier preguntasobre este básico puesta a punto de una tabla hash? Esta es una imagen de exactamentelo que dibujamos en el tablero. Pero ya lo dibujamos en el tablero, meNo voy a entrar en ella aún más. Esencialmente, las llaves, el cuadro negro de magia -o en este caso, la caja verde azulado - de un función hash los pone en cubos. Y en este ejemplo estamosno poner el nombre. Estamos poniendo el teléfono asociadonúmero del nombre en el cubo. Pero muy bien podría simplementeponer el nombre en el cubo. >> Esto es sólo una imagen de lo quedibujamos en el tablero. Tenemos dificultades potenciales, sin embargo. Y hay dos en particularLas diapositivas que quiero ir. La primera de ellas es de aproximadamenteuna función hash. Así que hice la pregunta, ¿quéhace una buena función hash? Le doy dos respuestas. La primera es que es determinista. En el contexto de las funciones de hash,¿qué significa esto? ¿Sí? >> AUDIENCIA: Puede encontrar elíndice constante de tiempo? >> JASON HIRSCHHORN: Queno es lo que significa. Pero eso es una buena suposición. ¿Alguien más tiene una conjeturaa lo que esto significa? Que una buena función hashes determinista? Annie? >> AUDIENCIA: Que una tecla sólo se puede asignara un lugar en la tabla hash. >> JASON HIRSCHHORN: Eso esexactamente correcto. Cada vez que usted pone en la calabaza,siempre devuelve cero. Si usted pone en la calabaza y el hachísla función devuelve cero, pero tiene un probabilidad de volver algomás mayor que cero - así que tal vez puede devolver uno a veceso otras dos veces - eso no es una buena función hash. Tienes toda la razón. Su función hash debe devolver elmismo número entero exacto, en este caso, por la misma cadena exacta. >> Tal vez devuelve el mismo número entero exactopara la misma cadena exacta independientemente de la capitalización. Pero en ese caso es todavíadeterminista porque varias cosas se asignan en el mismo valor. Eso está bien. Mientras que sólo hay unade salida para una entrada dada. >> Aceptar. La segunda cosa es quedevuelve índices válidos. Trajimos hasta que antes. Esta función hash - oh boy - una función hash debevolver índices válidos. Así lo dicen - vamos a volver a este ejemplo. Mi función hash cuenta hastalas letras de la palabra. Esa es la función hash. Y vuelve ese entero. Así que si tengo la palabra A, esva a devolver uno. Y se va a poner una aquí. ¿Qué pasa si me pongo en la palabra murciélago? Se va a devolver tres. ¿A dónde va murciélago? >> No encaja. Pero tiene que ir a alguna parte. Este es mi tabla hash después de todo, ytodo tiene que ir a alguna parte. Entonces, ¿dónde debe ir murciélago? ¿Alguna idea? Conjeturas? Las buenas conjeturas? >> AUDIENCIA: Zero. >> JASON HIRSCHHORN: ¿Por qué cero? >> AUDIENCIA: Porque tresmodulo tres es igual a cero? >> JASON HIRSCHHORN: Triplemódulo de tres es cero. Esa es una gran suposición,y eso es correcto. Así que en este caso se debeProbablemente vaya a cero. Así que una buena manera de asegurarse de que este hashfunción sólo devuelve índices válidos se al modulo que por el tamaño de la tabla. Si Modulo Sea lo vuelve portres, siempre se va a conseguir algo entre cero, uno y dos. Y si esto siempre devuelve siete, ysiempre Modulo por tres, eres siempre va a conseguir lo mismo. >> Por lo que es aún deterministasi MODULO. Pero eso va a asegurar que ustednunca conseguir algo - una industria no válido. Generalmente, módulo que debería ocurrirdentro de su función de hash. Así que usted no tiene que preocuparse por esto. Sólo puede asegurarse de queeste es un indice válida. ¿Tiene preguntas sobre estepotencial escollo? >> Aceptar. Y ahí vamos. Siguiente error potencial yesta es la grande. ¿Qué pasa si dos claves mapaen el mismo valor? Así que hay dos maneras de manejar esto. La primera se llama linealsondeo, que estoy No voy a ir otra vez. Pero usted debe estar familiarizado con la formaque funciona y lo que es eso. >> El segundo, voy a ir másya que es el que muchos la gente probablemente va a terminar de decidirpara usar en su conjunto de problemas. Por supuesto, usted no tiene que hacerlo. Sin embargo, para el conjunto de problemas, muchas personastienden a optar por crear una tabla hash con encadenamiento separado para implementarsu diccionario. Así que vamos a ir más de lo que significapara crear una tabla hash con encadenamiento separado. >> Así que me puse en calabaza. Devuelve cero. Y puse calabaza aquí. Entonces me puse en - lo que es otra cosa con temas de Halloween? >> AUDIENCIA: Candy. >> JASON HIRSCHHORN: caramelo! Eso es un gran uno. Puse en los dulces y caramelosTambién me da cero. ¿Qué hago? ¿Alguna idea? Debido a que toda la clase de sabelo encadenamiento separado es. Así que cualquier idea de qué hacer? Sí. >> AUDIENCIA: Poner la cadenarealidad en la tabla hash. >> JASON HIRSCHHORN: Así que vamos adibujar la buena idea aquí. Aceptar. >> AUDIENCIA: Tener la tabla hash[Inaudible] el puntero que apunta ael principio de una lista. Y luego han calabaza ser el primer valoren esa lista y dulces vinculado ser el segundo valor en esa lista enlazada. >> JASON HIRSCHHORN: OK. Marcus, que era excepcional. Voy a romper eso. Marcus está diciendo que nosobrescribir calabaza. Eso sería malo. No poner el caramelo en otro lugar. Vamos a poner a ambos en cero. Pero vamos a hacer frente aponiéndolos a cero la creación de una lista en cero. Y vamos a crear una lista detodo lo que se asigna a cero. Y la mejor manera que hemos aprendido para crearuna lista que puede crecer y encoger dinámica no está dentrootra matriz. Así que no es una matriz multi-dimensional. Pero basta con crear una lista enlazada. >> Así que lo que él propuso - Voy a conseguir un nuevo - es crear una matriz con punteros,una matriz de punteros. Aceptar. Cualquier idea o sugerencia de lo que el tipo dede estos indicadores debería ser? Marcus? >> AUDIENCIA: Punteros a - >> JASON HIRSCHHORN: Debido a que usteddijo una lista enlazada, así - >> AUDIENCIA: punteros de nodo? >> JASON HIRSCHHORN: Punteros de nodo. Si las cosas en nuestra vinculadoslista de nodos son entonces debe ser punteros de nodo. ¿Y qué es lo que equivalen a un principio? >> AUDIENCIA: Nulo. >> JASON HIRSCHHORN: Nulo. Así que no es lo nuestro vacío. Vuelve calabaza cero. ¿Qué hacemos? Camina conmigo a través de él? En realidad, Marcus ya me dio. Alguien más me caminar a través de él. ¿Qué hacemos cuando - esto se ve muy similar alo que estábamos haciendo. Avi. >> AUDIENCIA: Me voy a tomar una conjetura. Así que cuando usted consigue el caramelo. >> JASON HIRSCHHORN: Si. Bueno, tenemos calabaza. Vamos a nuestra primera. Tenemos calabaza. >> AUDIENCIA: OK. Vuelve calabaza cero. Así lo pones en eso. O en realidad, lo ponesen la lista enlazada. >> JASON HIRSCHHORN: ¿Cómolo puso en la lista enlazada? >> AUDIENCIA: ¡Oh, la sintaxis actual? >> JASON HIRSCHHORN: Sólo hay que pasar - decir más. ¿Qué hacemos? >> AUDIENCIA: Sólo hay que insertarcomo el primer nodo. >> JASON HIRSCHHORN: OK. Así que tenemos nuestro nodo, calabaza. Y ahora ¿cómo lo introduzco? >> AUDIENCIA: Usted asignaen el puntero. >> JASON HIRSCHHORN: ¿Qué puntero? >> AUDIENCIA: El indicador en cero. >> JASON HIRSCHHORN: Entonces, ¿dóndehace este punto? >> AUDIENCIA: Para nulo en estos momentos. >> JASON HIRSCHHORN: Bueno,está apuntando a null. Pero me voy a poner en la calabaza. Entonces, ¿dónde debería apuntar? >> AUDIENCIA: Para calabaza. >> JASON HIRSCHHORN: Para calabaza. Exactamente. Así que esto apunta a la calabaza. Y ¿de dónde viene este punteroen el punto de calabaza? A >> AUDIENCIA: Nulo. >> JASON HIRSCHHORN: null. Exactamente. Así que sólo nos insertamos algoa la lista enlazada. Acabamos de escribir el código para hacer esto. Casi casi nos locompletamente agrietado. Ahora insertamos el caramelo. Nuestro dulces también tiende a cero. Entonces, ¿qué hacemos con los dulces? >> AUDIENCIA: Depende de siNo estamos tratando de resolverlo. >> JASON HIRSCHHORN: Eso esexactamente correcto. Depende de si es o noque estamos tratando de solucionar el problema. Vamos a suponer que no estamosva a solucionar el problema. >> AUDIENCIA: Pues bien, como hemos comentadoantes, es más sencillo sólo para ponerlo desde el principio por lo que el punterode cero puntos a los dulces. >> JASON HIRSCHHORN: OK. Espera. Déjame crear dulces aquí. Así que este puntero - >> AUDIENCIA: Sí, ahora debeapuntar a los dulces. Luego que el puntero depunto de caramelo para la calabaza. >> JASON HIRSCHHORN: ¿Así? Y decimos que tenemos otracosa para asignar a cero? >> AUDIENCIA: Bueno, usted acaba dehacer lo mismo? >> JASON HIRSCHHORN: Hacer lo mismo. Así que en este caso, si no lo hacemosquieren mantener lo resuelto que Suena bastante simple. Tomamos el puntero en el indicedada por nuestra función hash. Tenemos que apuntan a nuestro nuevo nodo. Y entonces lo que estaba señalandopreviamente - en este caso nulo, en elsegundo caso calabaza - que, sea lo que está señalandoanteriormente, se añade en el siguiente de nuestro nuevo nodo. Estamos insertando algoen el comienzo. De hecho, esto es mucho más simple quetratando de mantener la lista ordenada. Pero, de nuevo, la búsqueda serámás complicado aquí. Siempre tendremos que ir hasta el final. >> Aceptar. ¿Una pregunta sobre encadenamiento separado? ¿Cómo funciona? Por favor, pregunte ahora. Tengo muchas ganas de asegurarse de que todos losentender esto antes de que nos dirigimos. >> AUDIENCIA: ¿Por qué te pones de calabazay los dulces en el mismo parte de la tabla hash? >> JASON HIRSCHHORN: Buena pregunta. ¿Por qué los ponemos en la mismaparte de la tabla hash? Bueno, en este caso nuestra función hashdevuelve cero para los dos. Así que tienen que ir en cero indiceporque ahí es donde vamos a buscarlos si alguna vezquerer mirar para arriba. Una vez más, con un enfoque de sondeo linealnosotros no pondríamos a los dos al cero. Pero en el enfoque de la cadena independiente,nos vamos a poner a ambos en cero a continuación, crear una lista de cero. >> Y no queremos sobrescribir calabazasimplemente por eso, porque entonces vamos a asumir que la calabaza eranunca insertado. Si acabamos de tener una cosa en laubicación que sería malo. Entonces no habríaoportunidad de nosotros - si hemos tenido un duplicado, entoncessería simplemente borrar nuestro valor inicial. Así que por eso hacemos este enfoque. ¿O es por eso que elegimos - pero de nuevo,eligió el enfoque de encadenamiento separado, que hay muchos otros enfoquesuno puede elegir. ¿Responde esto a su pregunta? >> Aceptar. Carlos. Sondeo lineal implicaría - si encontramos una colisión a cero,se vería en el punto siguiente para ver si que estaba abierto y lo puso allí. Y entonces nos miramos en el siguiente deporte yver si estaba abierto y lo puso allí. Así nos encontramos con la siguiente disposiciónlugar abierto y lo puso allí. ¿Alguna otra pregunta? Sí, Avi. >> AUDIENCIA: Como seguimiento a eso,¿qué quiere decir el próximo acto? En la tabla hash o en una lista enlazada. >> JASON HIRSCHHORN: Para linealprogramación, no hay listas enlazadas. El siguiente punto en la tabla hash. >> AUDIENCIA: OK. Así que la tabla hash seríainicializado al tamaño - como el número de cadenasque estuviera insertando? >> JASON HIRSCHHORN: Lo haríasquiero que sea muy grande. Sí. Aquí está una foto de lo queacaba de dibujar en el tablero. Una vez más, tenemos una colisión aquí. en 152. Y verás que hemos creadouna lista enlazada fuera de ella. Una vez más, la tabla hash encadenamiento separadoenfoque no es el que usted tienen que tomar para establecer los problemasseis, pero es una que mucha los estudiantes tienden a tomar. Así que en ese sentido, vamos a hablar brevementeantes de que nos dirigimos a cabo sobre el problema de las seis, y luego voy a compartir con ustedes una historia. Tenemos tres minutos. >> Problema seis set. Usted tiene cuatro funciones - carga, comprobar, el tamaño y descarga. Load - bueno, hemos estado yendosobre carga en este momento. Dibujamos la carga en el tablero. E incluso nos empezamos a codificar una gran cantidad deinsertar en una lista enlazada. Así que la carga no es mucho más quelo que hemos estado haciendo. >> Descubre que es una vez que hayaalgo cargado. Es el mismo proceso que este. Las mismas dos primeras partes donde usted lanzaalgo dentro de la función hash y obtener su valor. Pero ahora no estamos de insertarlo. Ahora estamos buscando. He escrito el código de ejemplo para encontraralgo en una lista enlazada. Os animo a practicar eso. Pero intuitivamente encontrar algo que sebastante similar a la inserción de algo. De hecho, nos hizo un dibujo de la búsquedaalgo en una lista enlazada, moviéndose a través hasta que llegamos a la final. Y si llegamos a la final y no podíaencuentra, entonces no está allí. Así que eso es cheque, esencialmente. >> Siguiente es el tamaño. Vamos a saltar tamaño. Finalmente has descargar. Unload es que no hemos elaboradoen la pizarra o aún codificada. Pero me animo a probar a programarloen nuestra muestra ejemplo de lista enlazada. Pero descargar intuitivaes similar a la libre - o que quiero decir es similar a comprobar. Excepto por el momento cada vez que usted vaa través, no estas seleccionando a ver si usted tiene su valor allí. Pero usted está tomando ese nodo yliberándola, esencialmente. Eso es lo que descarga te pide que hagas. Todo lo libre que ha malloced. Así que vas a través de toda la listade nuevo, pasando por todo el hash mesa de nuevo. Esta vez no marcapara ver lo que hay allí. Sólo liberar lo que hay. >> Y finalmente tamaño. Tamaño debe ser implementado. Si no se implementa el tamaño - Voy a decirlo de esta manera. Si no se implementa tamaño exactamenteuna línea de código que incluye el volver declaración, usted eshaciendo tamaño incorrectamente. Así que asegúrese de que el tamaño, para el diseño completopuntos, lo estás haciendo exactamente en un línea de código, incluyendola sentencia return. >> Y no las maletas, sin embargo, Akchar. Eager Beaver. Quería dar las gracias chicospor venir a la sección. Tenga un feliz Halloween. Este es mi disfraz. Llevaré este juevessi te veo en horario de oficina. Y si eres curioso acerca un poco másfondo para este traje, se sienten libre de visitar la sección 2011para una historia sobre por qué estoy vistiendo el traje de calabaza. Y es una historia triste. Así que asegúrese de que tienealgunos tejidos cercanos. Pero en eso, si usted tiene cualquierpreguntas que me quedaré por aquí fuera después de la sección. Buena suerte en problema seises. Y como siempre, si tiene algunapreguntas, que me haga saber.

Noticias relacionadas