2008年6月7日 星期六

CCC-Iterator

使用C實作了Iterator
C語言實在是一個非常有趣的語言
應該說是
high level assembly ? 雖然我不太懂組合語言
但光是使用C就能感覺到他的power


#include
#define TRUE 1
#define FALSE 0

struct Iterator;
struct List;
struct List_Node;
typedef unsigned short (*Method_hasNext)(struct Iterator*);
typedef void* (*Method_next)(struct Iterator*);


typedef struct Iterator {
struct List_Node* current_element;
Method_hasNext hasNext;
Method_next next;
} Iterator;

typedef struct List_Node {
void* data;
struct List_Node* next;
} List_Node;

typedef struct List {
List_Node* head;
Iterator* (*getIterator)(struct List*);
void (*addData)(struct List*, void*);
} List;

void addData(struct List* stru, void* data)
{
List_Node* n;
for(n = stru->head; n != NULL; n = n->next ) {
if( (n->next) == NULL ) {
n->data = data;
break;
}
}
n->next = (List_Node*) malloc(sizeof(List_Node));
n->next->data = 0;
n->next->next = 0;
}

unsigned short hasNext(Iterator* i)
{
if(i->current_element->data == NULL)
return FALSE;
return TRUE;
}

void* next(Iterator* i)
{
void* ret = i->current_element->data;
i->current_element = i->current_element->next;
return ret;
}

Iterator* getIterator(struct List* stru)
{
Iterator* ret = (Iterator*) malloc(sizeof(Iterator));
ret->current_element = stru->head;
ret->hasNext = hasNext;
ret->next = next;
return ret;
}

List* New_List()
{
List* ret = (List*) malloc(sizeof(List));
ret->head = (List_Node*) malloc(sizeof(List_Node));
ret->head->data = 0;
ret->head->next = 0;
ret->addData = addData;
ret->getIterator = getIterator;
return ret;
};

int main(void)
{
List* strs = New_List();
strs->addData(strs, "John\n");
strs->addData(strs, "Paul\n");
strs->addData(strs, "Ringo\n");
strs->addData(strs, "George\n");
Iterator* i;
for( i = strs->getIterator(strs); i->hasNext(i) == TRUE;) {
printf("%s", (char*)i->next(i));
}
return 0;
}

沒有留言: