现在的位置: 首页 > 综合 > 正文

数据结构基础(3)–>队列

2013年09月07日 ⁄ 综合 ⁄ 共 2278字 ⁄ 字号 评论关闭

queue.h

#ifndef	QUEUE_H
#define	QUEUE_H		1
#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define	QUEUE_NODE_MAX		1024

struct qnode
{
	char		name[32];
	int		num;
	struct	qnode	*next;
};
struct queue
{
	int		queuesize;
	struct	qnode	*head;
	struct	qnode	*tail;
};

int initqueue(struct queue **head);
void destroyqueue(struct queue **head);
void clearqueue(struct queue *head);
int queueempty(const struct queue *head);
int queuelength(const struct queue *head);
int queueinsert(struct queue *head, struct qnode *new);
struct qnode *queuedelete(struct queue *head);
void printqnode(const struct qnode *node);
int printqhead(const struct queue *head);

#endif /* QUEUE_H */

queue.c

#include <queue.h>

int initqueue(struct queue **head)
{
	*head = (struct queue *)malloc(sizeof(struct queue));
	if(!*head) {
		return -1;
	}
	(*head)->queuesize = 0;
	memset(*head, 0, sizeof(struct queue));
	(*head)->head = (struct qnode *)malloc(sizeof(struct qnode));
	(*head)->tail = (struct qnode *)malloc(sizeof(struct qnode));
	if(!(*head)->head || (!(*head)->tail)) {
		free((*head)->head);
		free((*head)->tail);
		free(*head);
		*head = NULL;
		return -1;
	}
	strcpy((*head)->head->name, "head");
	(*head)->head->num = 0;
	(*head)->head->next = (*head)->tail;
	strcpy((*head)->tail->name, "tail");
	(*head)->tail->num = 0;
	(*head)->tail->next = (*head)->head;
	return 0;
}
void destroyqueue(struct queue **head)
{
	clearqueue(*head);
	free(*head);
	*head = NULL;
}
void clearqueue(struct queue *head)
{
	struct	qnode	*node;
	while(head->head->next != head->tail) {
		node = head->head->next->next;
		free(head->head->next);
		head->head->next = node;
	}
}
int queueempty(const struct queue *head)
{
	return head->head->next == head->tail;
}
int queuelength(const struct queue *head)
{
	return head->queuesize;
}
int queueinsert(struct queue *head, struct qnode *new)
{
	if(QUEUE_NODE_MAX == head->queuesize) {
		return -1;
	}
	++(head->queuesize);
	new->next = head->tail;
	head->tail->next->next = new;
	head->tail->next = new;
	return 0;
}
struct qnode *queuedelete(struct queue *head)
{
	if(queueempty(head)) {
		return NULL;
	}
	--(head->queuesize);
	struct qnode *node;
	node = head->head->next;
	head->head->next = node->next;
	node->next = NULL;
	if(queueempty(head)) {
		head->tail->next = head->head;
	}
	return node;
}
void printqnode(const struct qnode *node)
{
	if(node) {
		printf("name=%10s, num=%3d...\n", node->name, node->num);
	} else {
		printf("is null...\n");
	}
}
int printqhead(const struct queue *head)
{
	struct qnode *n = head->head;
	do {
		printqnode(n);
		n = n->next;
	}while(n!=head->tail);
	printqnode(n);
	printf("printqhead end...\n");
	return 0;
}

抱歉!评论已关闭.