58127-1 C-ohjelmointi - Syksy 2000 : Kertausta: Tietorakenne LISTA
Tämän kerran kertauksen tavoitteena on muodostaa kirjasto funktioita, joiden avulla voi käsitellä listoja. Kirjasto koostuu kahdesta tiedostosta: List.h ja List.c. Tiedoston List.h sisältö näyttää seuraavalta:
#ifndef MY_LIST_LIBRARY #define MY_LIST_LIBRARY /* Määritellään listatyypit */ typedef struct listitem { struct listitem *Next; /* Seuraava alkio listassa */ struct listitem *Prev; /* Edellinen alkio listassa */ void *Data; /* Tietoalkio */ unsigned long Size; /* Tietoalkion koko */ } ListItem; typedef struct { ListItem *Head; /* Listan alku */ ListItem *Tail; /* Listan loppu */ unsigned long Items; /* Listan alkioiden lkm */ } List; /* Listakirjaston tukemat funktiot */ /* Luo uusi lista */ extern List *CreateList(void); /* Luo lista-alkio */ extern ListItem *CreateItem(void *Data,unsigned long Size); /* Lisää listan loppuun */ extern int AddTail(List *,ListItem *); /* Lisää listan alkuun */ extern int AddHead(List *,ListItem *); /* Laske listan pituus */ extern unsigned long ListLength(List *); /* Tuhoa lista */ extern void DeleteList(List *); /* Tulosta listan sisältö */ extern void PrintList(List *); /* Tarkista onko lista tyhjä */ extern int EmptyList(List *); #endifTiedoston List.c sisältö on seuraavaa:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "List.h" int main(void); int main(void) { List *MunLista; ListItem *MunItem; char sana[256+1]; if(!(MunLista = CreateList())) { printf("Jotain meni pieleen\n"); exit(1); } while( gets(sana) != NULL ) { if(!(MunItem = CreateItem((void *)sana,sizeof(sana)))) { printf("Jotain meni pieleen\n"); DeleteList(MunLista); exit(1); } AddTail(MunLista,MunItem); if(!(MunItem = CreateItem((void *)sana,sizeof(sana)))) { printf("Jotain meni pieleen\n"); DeleteList(MunLista); exit(1); } AddHead(MunLista,MunItem); printf("Nyt listassa on %ld alkiota\n",ListLength(MunLista)); } PrintList(MunLista); DeleteList(MunLista); if ( EmptyList(MunLista) ) printf("Lista on tyhjä\n"); else printf("Listassa on vielä tavaraa\n"); return 0; } /* Varataan muistia uudelle listalle ja alustetaan kentät */ List *CreateList(void) { List *uusi; if(!(uusi = (List *)malloc(sizeof(List)))) return NULL; uusi->Head = NULL; uusi->Tail = NULL; uusi->Items = 0; return uusi; } /* Varataan muistia uudelle listan alkiolle ja alustetaan kentät */ ListItem *CreateItem(void *Data,unsigned long size) { ListItem *uusi; /* Jos järkevää dataa ei ole annettu poistu */ if (Data == NULL) return NULL; if(!(uusi = (ListItem *)malloc(sizeof(ListItem)))) return NULL; if(!(uusi->Data = (void *)malloc(size))) return NULL; uusi->Next = NULL; uusi->Prev = NULL; memcpy(uusi->Data,Data,size); uusi->Size = size; return uusi; } /* Lisätään alkio listan loppuun */ extern int AddTail(List *lista,ListItem *item) { if (lista == NULL || item == NULL ) return 1; if ( lista->Head == NULL) lista->Head = lista->Tail = item; else { lista->Tail->Next = item; item->Prev = lista->Tail; lista->Tail = item; } lista->Items++; return 0; } /* Lisätään alkio listan alkuun */ extern int AddHead(List *lista,ListItem *item) { if (lista == NULL || item == NULL ) return 1; if ( lista->Head == NULL) lista->Head = lista->Tail = item; else { lista->Head->Prev = item; item->Next = lista->Head; lista->Head = item; } lista->Items++; return 0; } /* 'Lasketaan' listan pituus */ unsigned long ListLength(List *lista) { if ( lista == NULL ) return 0; else return lista->Items; } /* Tuhotaan koko lista */ void DeleteList(List *lista) { ListItem *tmp; if ( lista == NULL ) return; tmp = lista->Head; while(tmp != NULL) { tmp = lista->Head->Next; free(lista->Head->Data); free(lista->Head); lista->Head = tmp; } free(lista); } /* Tulostetaan koko lista */ void PrintList(List *lista) { ListItem *tmp = lista->Head; printf("|"); while(tmp != NULL) { printf("%s|",(char *)tmp->Data); tmp = tmp->Next; } printf("|-\n"); } /* Tarkista onko lista tyhjä */ int EmptyList(List *lista) { if ( lista == NULL) return 1; else if (lista->Head == NULL ) return 1; else return 0; }
Jan Lindström (Jan.Lindstrom@cs.Helsinki.FI)