Lite om länkade strukturer

Relevanta dokument
Övning från förra gången: readword

Tentamen EDAF30 Programmering i C++

Tentamen EDAF30 Programmering i C++

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Programmeringsteknik med C och Matlab

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

TDIU01 - Programmering i C++, grundkurs

Operativsystem ID1200/06 Tentamen :00-18:00

... Funktionsanrop. Vad händer när man kör ett program?

Tentamen Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning 6: Introduktion av listor

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Datastrukturer och algoritmer

Pekare och arrayer. Indexering och avreferering

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

TDDC74 Programmering, abstraktion och modellering. Tentamen

Lösningsförslag. TDDC74 Programmering: Abstraktion och modellering. Dugga 3 (provkod TEN1), Tid: kl 14-16, Datum:

Programmering B med Visual C

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Datastrukturer och algoritmer

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Abstrakta datastrukturer

F5: Högnivåprogrammering

tentamensdags och lab 3

Operativsystem (ID2200/06) XX XX:00-XX:00

Datastrukturer och algoritmer

F5: Högnivåprogrammering

Tentamen *:58/ID100V Programmering i C Exempel 3

Kapitel 6 - Undantag

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 13. Träd

2 Pekare och dynamiska variabler.

Poster ( structar ) Postdeklarationer

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

TDDC74 Lab 02 Listor, sammansatta strukturer

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

Länkade strukturer, parametriserade typer och undantag

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

tentaplugg.nu av studenter för studenter

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDDC74 Programmering, abstraktion och modellering DUGGA 2

#include <stdio.h> #include <string.h>

Det finns många flaggor till g++,

Dugga Datastrukturer (DAT036)

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Kurskod D0010E Datum Skrivtid 5tim

Föreläsning 12. Länkade listor

Lösningsförslag till tentamen Datastrukturer, DAT037,

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

Datastrukturer. föreläsning 3. Stacks 1

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Föreläsning 2. Länkad lista och iterator

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

Algoritmer och datastrukturer 2012, fo rela sning 8

Tentamen Datastrukturer (DAT036)

Föreläsning 5: Introduktion av pekare

Operativsystem ID1200/06 Tentamen :00-18:00

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

Generisk klass med typparameter Inre klass - ListIterator

TDDC74 Programmering, abstraktion och modellering. Tentamen

Övning 2. (Länkade) Listor, noder

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Föreläsning 11. Tobias Wrigstad. Bra och läsbar kod Defensiv programmering

Laboration A Objektsamlingar

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

TENTAMEN I DATAVETENSKAP

Pekare ( )

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

SP:PROG3 HT12 Tenta

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

TDDC76 - Programmering och Datastrukturer

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Transkript:

Lite om länkade strukturer Tobias Wrigstad Notation, insättning, frigöra

Notation Structen ritar vi så här tyedef struct link link_t; struct link { int value; link_t *next; }; value next eller i bland så här (värden istället för osternas namn) 42 strecket betyder NULL ibland skriver vi ut NULL

Länkarna i en länkad lista ritar vi så här 12 17 42 Dessa avser samma strukt som föregående bild, dvs. link_t

Struktarna som bygger u en länkad lista Själva listan Länkarna tyedef struct list list_t; struct list { link_t *first; link_t *last; }; tyedef struct link link_t; struct link { int value; link_t *next; };

En komlett länkad lista 12 17 42 link_t list_t

De olika delarna och hur man kommer åt dem 12 17 42 ->first->next

De olika delarna och hur man kommer åt dem 12 20 42 ->first->next->value = 20;

Lägg till ett element i listan 12 17 42 link_t *new = malloc(sizeof(link_t)); new->value = 14; new->next = ->first->next; ->first->next = new;

Lägg till ett element i listan [steg 1] 12 17 42?? new link_t *new = malloc(sizeof(link_t)); new->value = 14; new->next = ->first->next; ->first->next = new;

Lägg till ett element i listan [steg 2] 12 17 42 14? new link_t *new = malloc(sizeof(link_t)); new->value = 14; new->next = ->first->next; ->first->next = new;

Lägg till ett element i listan [steg 3] 12 17 42 14 new link_t *new = malloc(sizeof(link_t)); new->value = 14; new->next = ->first->next; ->first->next = new;

Lägg till ett element i listan [steg 4] 12 17 42 14 new link_t *new = malloc(sizeof(link_t)); new->value = 14; new->next = ->first->next; ->first->next = new;

Listan mindre rörigt ritad 12 14 17 42 new OBS! Samma lista och inget har flyttat å sig.

örslag till övning å kammaren Skriv ett rogram som tar in strängar som kommandoradsargument och som stoar in dem i en länkad lista och skriver ut dem Utgå från rogrammet nedan som looar genom kommandoradsargumenten och skriver ut dem (utan en länkad lista) Skriv en funktion list_aend som stoar in sista med hjäl av last i list_t Skriv en funktion list_reend som stoar in sista med hjäl av first i list_t Skriv en funktion list_insert som använder strcm för att stoa in strängarna i sorteringsordning int main(int argc, char *argv[]) { for(int i = 0; i < argc; ++i) uts(argv[i]); return 0; }

Att frigöra en länkad lista Ny notation: M 42 42 M betyder att malloc anser att strukten används betyder att malloc anser att strukten inte används och är fri att återanvända dess minne OBS! Vi får inte läsa struktar vars minne är för de kanske inte finns längre Röda värden i strukten betyder att de kanske inte finns längre

rigöra en länkad lista försök 1 (1/2) [OBS! el] M M M 12 20 42 M free();

rigöra en länkad lista försök 1 (2/2) [OBS! el] M M M 12 20 42 free();

Observationer Så fort vi gör free() så kan malloc återanvända det minne som ekar å När sker det? Generellt omöjligt att veta. Därför: efter att du gjort free() får inte inte använda igen förrän du har ekat om att eka å något data som du vet är validt Konsekvens av free() blir därför vi förlorar möjligheten att komma åt ->first, ->first->next, och ->first->next->next vilket i förlängningen betyder att vi läcker minne (3 link_t-struktar för att vara exakt)

rigöra en länkad lista försök 2 (1/3) [OBS! el igen] M M M 12 20 42 M free(); free(->first); free(->first->next); free(->first->next->next);

rigöra en länkad lista försök 2 (2/3) [OBS! el igen] M M M 12 20 42 free(); free(->first); free(->first->next); free(->first->next->next);

rigöra en länkad lista försök 2 (3/3) [OBS! el igen] M M M 12 20 42 free(); free(->first); free(->first->next); free(->first->next->next);

Observationer Vi gör free i omvänd ordning Vi måste börja i slutet av listan så att vi inte hela tiden frigör det minne som vi sedan vill läsa för att komma åt next-ekaren Det finns risk att rogram som gör så här fungerar ändå T.ex. för att inget minne återanvänds mellan free(); och free(->next); men det är ändå ett felaktigt rogram Ta hjäl av valgrind för att hitta denna ty av fel Invalid read of size 8 du läser 8 bytes av minne som inte är i en strukt som är M Efter free() blir en s.k. dangling ointer en ekare till ett minnesblock som inte längre finns

rigöra en länkad lista försök 3 [OBS! Korrekt] M M M 12 20 42 M free(->first->next->next); free(->first->next); free(->first); free();

rigöra en länkad lista försök 3 [OBS! Korrekt] M M 12 20 42 M free(->first->next->next); free(->first->next); free(->first); free();

rigöra en länkad lista försök 3 [OBS! Korrekt] M 12 20 42 M free(->first->next->next); free(->first->next); free(->first); free();

rigöra en länkad lista försök 3 [OBS! Korrekt] 12 20 42 M free(->first->next->next); free(->first->next); free(->first); free();

rigöra en länkad lista försök 3 [OBS! Korrekt] 12 20 42 free(->first->next->next); free(->first->next); free(->first); free();

Observationer Observera att minnet inte suddas när man gör free Det är därför som det finns skrädata överallt när man allokerar med malloc Om du har otur kan du lyckas frigöra minne och sedan använda det utan att märka det Ett litet tis för att undvika detta roblem använd nedanstående istället för free #define ree(tr) { free(tr); tr = NULL; } Med ree(); sätts till NULL som sido-effekt vilket kommer att få kod som gör felet i försök två att krascha med ett segfault (det hade stått ree(); ree(->next); den andra ree hade kraschat)

örslag till övning å kammaren Utöka rogrammet från föregående övning med stöd för att ta bort den länkade listan Imlementera list_free_rec som tar bort listan med hjäl av link_free_rec som är en rekursiv hjälfunktion Imlementera list_free_iter som tar bort listan med hjäl av en loo och utan att anroa några hjälfunktioner Använd ree-makrot från föregående bild för att undvika att du använder dangling ointers av misstag Använd valgrind för att verifiera att ditt rogram inte läcker minne