view TaskQueue.c @ 2:803d6bf22e6d default tip

second commit. it's far to complete..
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Tue, 22 Dec 2009 16:19:56 +0900
parents 5b089096921f
children
line wrap: on
line source

#include <stdlib.h>
// TODO: malloc
#include "List.h"
#include "Queue.h"

typedef struct _Queue {
	List *head;
	List *tail;
	int length;
} Queue;

Queue *
newQueue()
{
	Queue *queue;
	malloc(sizeof(struct _Queue));
	queue->head = NULL;
	queue->tail = NULL;
	queue->length = 0;
	return queue;
}

void
_QaddFirst(Queue *queue, void *)
{
	List *oldhead = queue->head;
	List *newlist;
	newlist = malloc(sizeof(struct _List));

	if (oldhead) {
		oldhead->prev = newlist;
	}
	newlist->next = oldhead;
	newlist->prev = NULL;
	queue->head = newlist;
	queue->length++;
	return ;
}

void
_QaddLast(Queue *queue, void *task)
{
	List *oldtail = queue->tail;
	List *newlist;
	newlist = malloc(sizeof(struct _List));

	if (oldtail) {
		oldtail->next = newlist;
	}
	newlist->next = NULL;
	newlist->prev = oldtail;
	queue->tail = newlist;
	queue->length++;
	return ;
}

void *
_QpollFirst(Queue *queue)
{
	List *first = queue->head;
	List *second;
	void *task;
	if (!first) return NULL;

	second = first->next;
	task = first->task;
	free(first);

	second->prev = NULL;
	queue->head = second;
	queue->length--;
	return task;
}

void *
_QpollLast(Queue *queue)
{
	List *first = queue->tail;
	List *second;
	void *task;
	if (!first) return NULL;

	second = first->prev;
	task = first->task;
	free(first);

	second->next = NULL;
	queue->tail = second;
	queue->length--;
	return task;
}