Mercurial > hg > Game > CbCTaskManager
view src/List.c @ 18:d31f9a0f9024
change interfaces of List.c.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 13 Jan 2010 17:26:58 +0900 |
parents | 07fab8c367b2 |
children |
line wrap: on
line source
#include<stdlib.h> /* TODO: malloc. */ #include"List.h" /* * * UserInterface * * list = createList(); * addFirst(list, data); * addLast(list, data); * getFirst(list, data); * getLast(list, data); * destroyList(list); * * iter = createIterator(list); * while (HasNext(iter)) { * data = Next(iter); * if (data->l...) * Remove(iter); * } * destroyListIter(iter); * * * from JavaDoc java.util.Iterator<E> * boolean hasNext() Returns true if the iteration has more elements. * E next() Returns the next element in the iteration. * void remove() Removes from the underlying collection the last element returned by the iterator. * * * ユーザは常にcreateList()で生成されたList構造体をもつ * このbaseだけは特別で何もデータを所持していない * base->nextは最初の要素 * base->prevは最後の要素を指している * それ以外のListは通常どおり、 * list->nextは次の要素 * list->prevは前の要素を指す * 最初の要素のlist->prev, 際の要素のlist->nextはNULL. * baseを指したりしない * * */ List * createList() { List *newlist; newlist = malloc(sizeof(List)); newlist->next = NULL; newlist->prev = NULL; return newlist; } void destroyList(List *list) { } int listEmpty(List *base) { return (base->next==NULL); } void listAddFirst(List *base, void *data) { List *head, *new; head = base->next; new = malloc(sizeof(List)); new->data = data; new->next = head; new->prev = NULL; if (head) { head->prev = new; } else { base->prev = new; } base->next = new; return; } void listAddLast(List *base, void *data) { List *tail, *new; tail = base->prev; new = malloc(sizeof(List)); new->data = data; new->prev = tail; new->next = NULL; if (tail) { tail->next = new; } else { base->next = new; } base->prev = new; return; } void * listGetLast(List *base) { if (base->prev) return base->prev->data; else return NULL; } void * listGetFirst(List *base) { if (base->next) return base->next->data; else return NULL; } void * listPollLast(List *base) { List *last, *newlast; void *data; last = base->prev; if (!last) { return NULL; } newlast = last->prev; data = last->data; free(last); if (newlast) { newlast->next = NULL; } else { base->next = NULL; } base->prev = newlast; return data; } void * listPollFirst(List *base) { List *head, *newhead; void *data; head = base->next; if (!head) { return NULL; } newhead = head->next; data = head->data; free(head); if (newhead) { newhead->next = NULL; } else { base->next = NULL; } base->next = newhead; return data; } void listRemove(List *base, void *data) { List *list; list = base->next; for (list=base->next; list; list=list->next) { if (list->data!=data) continue; if (list->prev) { list->prev->next = list->next; } else { base->next = list->next; } if (list->next) { list->next->prev = list->prev; } else { base->prev = list->prev; } free(list); return; } return; } ListIter * createIterator(List *base) { ListIter *iter; iter = malloc(sizeof(ListIter)); iter->list = base; iter->current = base; return iter; } void destroyIterator(ListIter *iter) { free(iter); } int listIterhasNext(ListIter *iter) { return iter->current->next!=NULL ; } void * listIterNext(ListIter *iter) { iter->current = iter->current->next; return iter->current->data; } void listIterRemove(ListIter *iter) { List *list, *removed; list = iter->list; removed = iter->current; if (removed->prev) { removed->prev->next = removed->next; iter->current = removed->prev; } else { iter->list->next = removed->next; iter->current = iter->list; } if (removed->next) { removed->next->prev = removed->prev; } else { iter->list->prev = removed->prev; } free(removed); }