您的位置:首页 > 理论基础 > 数据结构算法

(8)数据结构——队列(链表)实现

2013-08-16 14:01 531 查看
LinkListQueue.c

/*********************************************************************
*:
*:          Filename: LinkListQueue.h
*:
*:          Author: dspeeding
*:          Copyright (c) 2012, dspeeding
*:
*:        Created at: 2012.06.12
*:     Last modified: 2012.06.12
*:
*:      Introduction: 链表队列(数据结构)的c实现
*:
*:
*:*********************************************************************/
#ifndef _LINKLISTQUEUE_H_
#define _LINKLISTQUEUE_H_

#include "ElemType.h"

#define LINKLISTQUEUE_RET_OK            0
#define LINKLISTQUEUE_RET_ERROR            -1

typedef void (*Visit)(PCElemType);

/*定义结点结构体*/
typedef struct TDefLinkListNode
{
ElemType                    data;        /*数据域*/
struct TDefLinkListNode        *next;        /*链表指针*/
}LinkListNode;

typedef LinkListNode* PLinkListNode;
typedef const LinkListNode CLinkListNode;
typedef const LinkListNode* PCLinkListNode;

/*定义队列结构体*/
typedef struct TDefLinkListQueue
{
PLinkListNode        front;                /*队列首指针*/
PLinkListNode        rear;                /*队列尾指针*/
}LinkListQueue;

typedef LinkListQueue* PLinkListQueue;
typedef const LinkListQueue CLinkListQueue;
typedef const LinkListQueue* PCLinkListQueue;

/****************************************
Purpose :     初始化链表队列
Input   :     pQueue --队列指针
Return  :     None
*****************************************/
void InitLinkListQueue(PLinkListQueue pQueue);

/****************************************
Purpose :     向链表队列中增加一个元素
Input   :     pQueue -- 队列指针
pData  -- 数据指针
Return  :     0       -- 成功
-1       -- 失败
*****************************************/
int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData);

/****************************************
Purpose :     从链表队列中删除一个元素
Input   :     pQueue -- 队列指针
pData  -- 数据
Return  :     0       -- 成功
-1       -- 失败
*****************************************/
int DelLinkListQueue(PLinkListQueue pQueue, PElemType pData);

/****************************************
Purpose :     从链表队列中删除一个元素
Input   :     pQueue -- 队列指针
pData  -- 数据指针
Return  :     0       -- 成功
-1       -- 失败
*****************************************/
int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData);

/****************************************
Purpose :     从链表队列中读取队首元素
Input   :     pQueue -- 队列指针
pData  -- 数据指针
Return  :     0       -- 成功
-1       -- 失败
*****************************************/
int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData);

/****************************************
Purpose :     判断链表队列是否为空
Input   :     pQueue -- 队列指针
Return  :     0       -- 为空
其他   -- 非空
*****************************************/
int IsEmptyLinkListQueue(PLinkListQueue pQueue);

/****************************************
Purpose :     清空链表队列中所有元素
Input   :     pQueue -- 队列指针
Return  :     0       -- 成功
-1       -- 失败
*****************************************/
int ClearLinkListQueue(PLinkListQueue pQueue);

/*************************************************************************
Purpose :     从栈顶开始遍历整个栈
Input   :     pQueue -- 队列指针
visit  -- 遍历函数
Return  :     None
Modify  :
Remark  :
*************************************************************************/
void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit);

#endif


LinkListQueue.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkListQueue.h"

/*************************************************************************
Function:     InitLinkListQueue()
Purpose :     初始化链表队列
Input   :     pQueue --队列指针
Return  :     None
Modify  :
Remark  :
*************************************************************************/
void InitLinkListQueue(PLinkListQueue pQueue)
{
/*把队首和队尾指针置空*/
pQueue->front = NULL;
pQueue->rear = NULL;
return ;
}

/*************************************************************************
Function:     AddLinkListQueue()
Purpose :     向链表队列中增加一个元素
Input   :     pQueue -- 队列指针
mData  -- 数据
Return  :     0       -- 成功
-1       -- 失败
Modify  :
Remark  :
*************************************************************************/
int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData)
{
/*生成一个新的结点*/
PLinkListNode pNewNode;
pNewNode = malloc(sizeof(LinkListNode));
if(pNewNode == NULL)
{
/*内存分配失败*/
return LINKLISTQUEUE_RET_ERROR;
}

/*把mData的值赋值给新结点*/
memcpy(&pNewNode->data, pData, sizeof(ElemType));
pNewNode->next = NULL;

/*若链表队列为空,则新结点既是队首结点又是队尾结点*/
if(pQueue->rear == NULL)
{
pQueue->rear = pNewNode;
pQueue->front = pNewNode;
}
else
{
/*若队列非空,则依次修改队尾结点的指针,使之指向新的队尾结点*/
pQueue->rear->next = pNewNode;
pQueue->rear = pNewNode;
}

return LINKLISTQUEUE_RET_OK;
}

/*************************************************************************
Function:     OutLinkListQueue()
Purpose :     从链表队列中删除一个元素
Input   :     pQueue -- 队列指针
pData  -- 数据指针
Return  :     0       -- 成功
-1       -- 失败
Modify  :
Remark  :
*************************************************************************/
int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData)
{
PLinkListNode pNode;
if(pQueue->front == NULL)
{
/*队列为空*/
return LINKLISTQUEUE_RET_ERROR;
}

memcpy(pData, &pQueue->front->data, sizeof(ElemType));
pNode = pQueue->front;
pQueue->front = pNode->next;

/*若删除后链表队列为空,则需同时使队尾指针为空*/
if(pQueue->front == NULL)
{
pQueue->rear = NULL;
}

/*回收该结点内存*/
free(pNode);
pNode = NULL;

return LINKLISTQUEUE_RET_OK;
}

/*************************************************************************
Function:     PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData)
Purpose :     从链表队列中读取队首元素
Input   :     pQueue -- 队列指针
pData  -- 数据指针
Return  :     0       -- 成功
-1       -- 失败
Modify  :
Remark  :
*************************************************************************/
int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData)
{
if(pQueue->front == NULL)
{
/*队列为空*/
return LINKLISTQUEUE_RET_ERROR;
}
memcpy(pData, &pQueue->front->data, sizeof(ElemType));

return LINKLISTQUEUE_RET_OK;
}

/*************************************************************************
Function:     IsEmptyLinkListQueue(PLinkListQueue pQueue)
Purpose :     判断链表队列是否为空
Input   :     pQueue -- 队列指针
Return  :     0       -- 为空
其他   -- 非空
Modify  :
Remark  :
*************************************************************************/
int IsEmptyLinkListQueue(PLinkListQueue pQueue)
{
if(pQueue->front == NULL)
{
/*队列为空*/
return 0;
}
else
{
return -1;
}
}

/*************************************************************************
Function:     ClearLinkListQueue(PLinkListQueue pQueue)
Purpose :     清空链表队列中所有元素
Input   :     pQueue -- 队列指针
Return  :     0       -- 成功
-1       -- 失败
Modify  :
Remark  :
*************************************************************************/
int ClearLinkListQueue(PLinkListQueue pQueue)
{
PLinkListNode pNode;
/*依次删除队列中的每一个结点,最后使队首指针为空*/
pNode = pQueue->front;
while(pNode != NULL)
{
pQueue->front = pQueue->front->next;
free(pNode);
pNode = pQueue->front;
}

/*循环结束后队首指针已经为空
最后将队尾指针赋值为空*/
pQueue->rear = NULL;

return LINKLISTQUEUE_RET_OK;
}

/*************************************************************************
Purpose :     从栈顶开始遍历整个栈
Input   :     pQueue -- 队列指针
visit  -- 遍历函数
Return  :     None
Modify  :
Remark  :
*************************************************************************/
void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit)
{
PLinkListNode pNode;
pNode = pQueue->front;
while(pNode != NULL)
{
visit(&(pNode->data));
pNode = pNode->next;
}
}


ElemType.c及ElemType.h见上一节 循环队列 中的实现

testmian.c

/*********************************************************************
*:
*:          Filename: testLinkListQueue.c
*:
*:          Author: DongXiaolin
*:          Copyright (c) 2012, DongXiaolin
*:
*:        Created at: 2012.06.12
*:     Last modified: 2012.06.12
*:
*:      Introduction: 链表队列(数据结构)的demo
*:
*:
*:*********************************************************************/
#include <stdio.h>
#include "LinkListQueue.h"

int main()
{
LinkListQueue mQueue;
Stu a[4] = {{1,"zhangsan"}, {2,"lisi"}, {3,"wangwu"}, {4,"zhaoliu"}};
int i;

/*初始化队列*/
InitLinkListQueue(&mQueue);

/*向队列中插入数据*/
for(i=0;i<4;i++)
{
if(AddLinkListQueue(&mQueue, &a[i]))
{
printf("Insert fail[%d][%s]\n", a[i].nStuId, a[i].szStuName);
}
}

TraverseLinkListQueue(&mQueue, visit);

/*从队列中删除数据*/
ElemType outData;
if(OutLinkListQueue(&mQueue, &outData))
{
printf("Del Data fail\n");
}
printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName);
TraverseLinkListQueue(&mQueue, visit);

/*从队列中删除数据*/
if(OutLinkListQueue(&mQueue, &outData))
{
printf("Del Data fail\n");
}
printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName);
TraverseLinkListQueue(&mQueue, visit);

/*从队列中提取数据*/
if(PeekLinkListQueue(&mQueue, &outData))
{
printf("Peek Data fail\n");
}
printf("\nPeek Data[%d][%s]\n", outData.nStuId, outData.szStuName);
TraverseLinkListQueue(&mQueue, visit);

/*从队列中删除数据*/
if(OutLinkListQueue(&mQueue, &outData))
{
printf("Del Data fail\n");
}
printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName);
TraverseLinkListQueue(&mQueue, visit);
while(IsEmptyLinkListQueue(&mQueue))
{
if(OutLinkListQueue(&mQueue, &outData))
{
printf("Del Data fail\n");
}
printf("\nDo Del Data[%d][%s]\n", outData.nStuId, outData.szStuName);
}

/*清空队列*/
ClearLinkListQueue(&mQueue);

return 0;
}


makefile 如下 通用Makefile
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: