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

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

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Datastrukturer. föreläsning 3. Stacks 1

Tommy Färnqvist, IDA, Linköpings universitet

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

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

*Pekarvärden *Pekarvariabler & *

Tentamen *:58/ID100V Programmering i C Exempel 3

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

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

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Föreläsning 6: Introduktion av listor

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Föreläsning 4 Innehåll

Datastrukturer och algoritmer

Lösningar Datastrukturer TDA

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

Tentamen Datastrukturer (DAT036)

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

Symboliska konstanter const

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

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

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

TDIU01 - Programmering i C++, grundkurs

Sammansatta datatyper Generics: Parametrisk polymorfism

Datastrukturer och algoritmer

Föreläsning 2 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Datastrukturer och algoritmer

Länkade strukturer, parametriserade typer och undantag

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Erfarenheter från labben

TDDC74 Lab 04 Muterbara strukturer, omgivningar

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

maxlist-1. Indexerad lista Länkad lista

Abstrakta datastrukturer

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

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

2 Pekare och dynamiska variabler.

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

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

Tentamen i Algoritmer & Datastrukturer i Java

Vad har vi pratat om i kursen?

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

Exempel ( )

Dugga Datastrukturer (DAT036)

Värmedistribution i plåt

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

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

Länkade strukturer. (del 2)

Tommy Färnqvist, IDA, Linköpings universitet

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

Tentamen TEN1 HI

Lösningsförslag till tentamen Datastrukturer, DAT037,

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Föreläsning 5. Rekursion

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3. Stack

tentaplugg.nu av studenter för studenter

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

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

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

Föreläsning 7. Träd och binära sökträd

Sökning och sortering

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

Lämna in ifylld kursvärdering tillsammans med tentamen! Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Magnus Nielsen, IDA, Linköpings universitet

Poster ( structar ) Postdeklarationer

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Tommy Färnqvist, IDA, Linköpings universitet

Lösningsförslag till tentamen Datastrukturer, DAT037,

4 Sammansatta datatyper

Föreläsning 7. Träd och binära sökträd

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Föreläsning 6 pekare och pekare tillsammans med arrayer

Det finns många flaggor till g++,

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Föreläsning 11. ADT:er och datastrukturer

Exempeltenta GruDat 2002/2003

Programmering för språkteknologer II, HT2014. Rum

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Programkonstruktion och. Datastrukturer

Föreläsning Datastrukturer (DAT036)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

Laboration A Objektsamlingar

Föreläsning 10. ADT:er och datastrukturer

Föreläsning 4 Datastrukturer (DAT037)

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

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

Transkript:

Länkade listor i C Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till: Dynamiskt allokerad array Arrayer allokerade på stacken Kan alltså användas till att lagra en lista av data som representerar ett antal saker Använder dynamiskt minne 1

Länkad lista vs array Borttagning/insättning av element på viss (valfri) plats Länkad lista: effektiv Array: ineffektiv (elementen efter måste flyttas efter) Returnera ett element på plats med visst (valfritt) index. Länkad lista: Ineffektiv, måste loopa fram till platsen (och räkna under tiden) Array: Effektivt I många tillämpningar uppstår aldrig behovet att veta vad som finns på ett visst index 2

Länkade listor I en länkad lista ligger inte elementen nödvändigtvis i en följd i minnet. Elementen i länkade listan består av Datainnehållet, dvs det som man vill lagra (fortsättningsvis låtsas vi att det är en int som vi vill lagra, men det kan vara vilken datatyp som helst) Pekare till nästa element Eventuellt en pekare till förra elementet Annat som behövs... 3

Länkade listor, exempel En lista med 3 element: 4

Länkade listor, exempel En lista med 3 element: Pekare till början av listan Ett element Stoppmarkering i det sista elementets nextpekare Det blå är datat Pekare från ett element till nästa 5

Insättning En operation som man kan behöva på en länkad lista är att sätta in ett data sist. Vi antar först tom lista, dvs anropet av ListInsertLast(List *list, int data); Ser ut: ListInsertLast(, ); 6

Insättning Kopia av anroparens pekare till listan Kopia av anroparens data ListInsertLast(, ); Algoritmen, stegvis: Input : 7

Insättning Algoritmen, stegvis: Skapa ett Element (kallas ofta nod) Ett element (dynamiskt allokerat) Tillfällig pekare: 8

Insättning Algoritmen, stegvis: Skapa ett Element (kallas ofta nod) Sätt in datat i elementet Tom länk (NULL-pekare) 9

Insättning Algoritmen, stegvis: Skapa ett Element (kallas ofta nod) Sätt in datat i elementet Sätt listan att peka på elementet 10

Insättning Algoritmen, stegvis: Skapa ett Element (kallas ofta nod) Sätt in datat i elementet Sätt listan att peka på elementet Nu har vi en komplett lista med ett element Hur ska anroparen få glädje av den? - Returvärde! 11

Insättning Vi antar nu icke-tom lista, dvs anropet ListInsertLast(, );... 12

Insättning, algoritm Data att sätta in... 13

Insättning, algoritm Skapa Element och sätt in datat (som tidigare)... Tillf. Pekare till allokerat element. Data insatt i elementet 14

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera... Annan tillf. pekare 15

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet... 16

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet Nu når vi till nästa pil, ta den istället... 17

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet Nu når vi till nästa pil, ta den istället... 18

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet Nu når vi till nästa pil, ta den istället Upprepa tills det inte finns någon mer pil... 19

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet Nu når vi till nästa pil, ta den istället Upprepa tills det inte finns någon mer pil... 20

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet Nu når vi till nästa pil, ta den istället Upprepa tills det inte finns någon mer pil Sätt in en pekare där som det inte finns någon så att den pekar på det nya elementet... 21

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet Nu når vi till nästa pil, ta den istället Upprepa tills det inte finns någon mer pil Sätt in en pekare där som det inte finns någon så att den pekar på det nya elementet... 22

Insättning, algoritm Skapa Element och sätt in datat (som tidigare) Skaffa en en pekare för att iterera Sätt den att peka på första elementet Nu når vi till nästa pil, ta den istället Upprepa tills det inte finns någon mer pil Sätt in en pekare där som det inte finns någon så att den pekar på det nya elementet... Allt klart bara att returnera huvudpekaren 23

C-kod typedef struct Element Element; struct Element { Element *next; int data;}; Element *ListInsertLast(Element *e, int x) { Element *p=e,*ne=malloc(sizeof(element)); if (ne) { ne >data = x; ne >next = NULL; if (e) { while (p >next) p = p >next; p >next = ne; } else e = ne; } return e; } 24

övning Skriv om föregående kodexempel så att det blir två funktioner: En för fallet att det ännu inte finns någon lista: Element *ListCreateFirst(int x); En annan för fallet att det redan finns element: void ListExtend(Element *e, int x); Skriv slutligen om originalfunktionen så att den använder de två du nyss gjort Fundera på vad som är bäst för användaren: använda olika eller wrappern 25

Hålla reda på slutet Det är onödigt att leta igenom hela listan för att hitta slutet Ett alternativ är att hålla reda på både slutet och början av listan Även andra saker som berör hela listan kan man vilja hålla reda på (ex. Antal element) Ofta lägger man alla sådana saker i en annan struct (som det bara finns en av). En sådan utgör en abstraktion av hela 26 listan

Användning Element *list; list = ListInsertLast(NULL, 42); ListInsertLast(list, 99); ListInsertLast(list, 3); ListInsertLast(list, 19); ListPrint(list); 27

Printfunktion på listan void ListPrintAll(Element *e) { while (e) { printf( %d\n, e >data); e = e >next; } } Eller rekursivt: void ListPrintAll(Element *e) { if (e) { printf( %d\n, e >data); ListPrintAll(e >next); } } 28

övning Skriv en mainfunktion som Låter användaren skriva in heltal tills Ctrl-D Vartefter heltalen skrivs in ska de länkas in sist en en länkad lista. När detta är klart ska listan skrivas ut 29