69,371
社区成员
发帖
与我相关
我的任务
分享
队列的双向链表实现
时间 : 2009-11-14 作者:匿名 编辑:小张 点击: 67 [ 评论 ]
-
-
/*queue.h*/
#ifndef QUEUE_H_
#define QUEUE_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int tcreate_queue(int elem_size, int *queue);
int tadd_queue_head(int queue, void *elem);
int tadd_queue_tail(int queue, void *elem) ;
int tget_queue_head(int queue, void *elem);
int tget_queue_tail(int queue, void *elem);
int tdestory_queue(int queue);
#endif
#include "queue.h"
typedef struct Node
{
void *elem;
struct Node *prev;
struct Node *next;
}QNode;
typedef struct QLink
{
int data_size;
QNode *head;
QNode *tail;
}QLink;
/************************************************
*函数功能: 创建一个队列
*参数 @elem_size 表示数据大小,传去参数
*参数 @queue表示接口的handle ,传出参数
**************************************************/
int tcreate_queue(int elem_size, int *queue)
{
QLink *Qu = NULL;
Qu = (QLink *)malloc(sizeof(QLink));
if (Qu == NULL)
{
printf("fail!\n");
return -1;
}
Qu->data_size = elem_size;
Qu->head = NULL;
Qu->tail = NULL;
*queue = (int)Qu;
return 0;
}
/*******************************************
* 函数功能: 增加结点到 队列队头
*参数@queue 接口handle,传入参数
*参数@elem,数据,传入参数
********************************************/
int tadd_queue_head(int queue, void *elem)
{
QLink *Qu = NULL;
QNode *node = NULL;
QNode *pt = NULL;
Qu = (QLink *)queue;
node = (QNode *)malloc(sizeof(QNode));
if (node == NULL)
{
printf("fail!\n");
return -1;
}
node->elem = (void *)malloc(Qu->data_size);
if(node->elem == NULL)
{
printf("fail!\n");
free(node);
return -1;
}
memcpy(node->elem, elem, Qu->data_size);
if (Qu->head == NULL && Qu->tail == NULL)
{
Qu->head = node;
Qu->tail = node;
node->next = NULL;
node->prev = NULL;
}
else
{
pt = Qu->head;
pt->prev = node;
node->next = pt;
Qu->head = node;
node->prev = NULL;
}
return 0;
}
/**********************************************
* 函数功能: 添加结点到队列的队尾
*参数:@queue ,接口handle ,传入参数
*参数:@elem 数据,传入参数
************************************************/
int tadd_queue_tail(int queue, void *elem)
{
QLink *Qu = NULL;
QNode *node = NULL;
QNode *pt = NULL;
Qu = (QLink *)queue;
node = (QNode *)malloc(sizeof(QNode));
if (node == NULL)
{
printf("fail\n");
return -1;
}
node->elem = (void *)malloc(Qu->data_size);
if (node->elem == NULL)
{
printf("fail!\n");
free(node);
return -1;
}
memcpy (node->elem, elem, Qu->data_size);
pt = Qu->tail;
/*查看是否是第一个接点*/
if (Qu->head == NULL && Qu->tail == NULL)
{
Qu->head = node;
Qu->tail = node;
node->next = NULL;
node->prev = NULL;
}
else
{
pt->next = node;
node->next = NULL;
node->prev = pt;
Qu->tail = node;
}
return 0;
}
/*************************************************
*函数功能: 删除队列的队尾元素
*参数@ queue 接口handel,传入参数
*参数@elem 返回删除的数据,传出参数
**************************************************/
int tget_queue_tail(int queue, void *elem )
{
QLink *Qu = NULL;
QNode *pt = NULL;
Qu = (QLink *)queue;
pt = Qu->tail;
if (Qu->head == NULL && Qu->tail == NULL)
{
printf("queue is empty!\n");
return -1;
}
memcpy(elem, pt->elem, Qu->data_size);
if (Qu->head == Qu->tail)
{
Qu->head = NULL;
Qu->tail = NULL;
free(pt);
}
else
{
Qu->tail = pt->prev;
pt->prev->next = NULL;
free(pt);
}
return 0;
}
/***************************************************
*函数功能 : 删除队列的 头结点
*参数@queue 接口handle ,传入参数
*参数@elem,返回删除的数据,传出参数
****************************************************/
int tget_queue_head(int queue, void *elem)
{
QLink *Qu = NULL;
QNode *pt = NULL;
Qu = (QLink *)queue;
pt = Qu->head;
if (Qu->head == NULL && Qu->tail == NULL)
{
printf("queue is empty !\n");
return -1;
}
memcpy(elem, pt->elem, Qu->data_size);
if (Qu->head == Qu->tail)
{
Qu->head = NULL;
Qu->tail = NULL;
free(pt);
}
else
{
Qu->head = pt->next;
pt->next->prev = NULL;
free(pt);
}
return 0;
}
/*****************************************
*函数功能: 销毁队列
*参数@queue 接口的handle,传入参数
******************************************/
int tdestory_queue(int queue)
{
QLink *Qu = NULL;
QNode *pt = NULL;
Qu = (QLink *)queue;
if (Qu->head == NULL && Qu->tail == NULL)
{
printf("queue is empty!\n");
free(Qu);
return -1;
}
pt = Qu->head;
while(pt != NULL)
{
Qu->head = pt->next;
free(pt);
pt = Qu->head;
}
Qu->head = NULL;
Qu->tail = NULL;
#if 0
while(Qu->head != NULL)
{
Qu->head = pt->next;
pt->next->prev = NULL;
free(pt);
pt = Qu->head;
if (Qu->head == Qu->tail)
{
Qu->head =NULL;
Qu->tail = NULL;
free(pt);
}
}
#endif
free(Qu);
return 0;
}
/***************************************
*函数功能: 打印队列
*参数@queue, 接口handle,传入参数
*****************************************/
static int print(int queue)
{
QLink *Qu = NULL;
QNode *pt = NULL;
Qu = (QLink *)queue;
pt = Qu->head;
if (Qu->head == NULL && Qu->tail == NULL)
{
printf("queue is empty !\n");
return 0;
}
while(pt != NULL)
{
printf("%s\n", pt->elem);
pt = pt->next;
}
return 0;
}
void menu()
{
printf("******************************\n");
printf("选择你的操作:\n");
printf("1 创建一个队列\n");
printf("2 添加结点到队头\n");
printf("3 添加结点到队尾\n");
printf("4 删除队列头结点\n");
printf("5 删除队列尾结点\n");
printf("6 销毁队列\n");
printf("7 打印队列\n");
printf("8 退出\n");
printf("******************************\n");
}
int main()
{
int *queue = NULL;
int size = 0;
char *elem= NULL;
int choice = 0;
queue = (int *)malloc(sizeof (int));
if (queue == NULL)
{
printf("fail!\n");
goto fail;
}
elem = (char *)malloc(sizeof(char));
if (elem == NULL)
{
printf("fail!\n");
goto fail;
}
while(1)
{
menu();
printf ("选择你的操作:\n");
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("input data_size:\n");
scanf("%d", &size);
tcreate_queue(size, queue );
break;
case 2:
printf("Add node head ,input elem:\n");
scanf("%s", elem);
tadd_queue_head(*queue, elem);
printf("Add head success!\n");
break;
case 3:
printf("Add node tail ,input elem:\n");
scanf("%s", elem);
tadd_queue_tail(*queue, elem);
printf("Add tail success!\n");
break;
case 4:
printf("delete node head!\n");
tget_queue_head(*queue, elem);
printf("delete head success!\n");
break;
case 5:
printf("delete node tail!\n");
tget_queue_tail(*queue, elem);
printf("delete tail success!\n");
break;
case 6:
printf("destory queue!\n");
tdestory_queue(*queue);
printf("destory success!\n");
break;
case 7:
printf("print queue:\n");
print(*queue);
break;
case 8:
return 0;
default :
printf ("Input error !\n");
break;
}
}
fail:
if(elem)
{
free(elem);
elem = NULL;
}
if (queue)
{
free(queue);
queue = NULL;
}
return 0;
}