队列的链式存储
队列也是一种特殊的线性表,队列相比于链表,是在链表的一端插入元素,另外一端取出元素,遵循“先进先出”的原则,与栈相反,队列的存储也用到了链表的API函数
//头文件1-链表的api函数及定义的节点
#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_
typedef void LinkList;
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode;
LinkList* LinkList_Create();
void LinkList_Destroy(LinkList* list);
void LinkList_Clear(LinkList* list);
int LinkList_Length(LinkList* list);
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
LinkListNode* LinkList_Get(LinkList* list, int pos);
LinkListNode* LinkList_Delete(LinkList* list, int pos);
#endif
//头文件2-链式队列的api函数声明
#ifndef _MY_LINKQUEUE_H
#define _MY_LINKQUEUE_H
typedef void LinkQueue;
LinkQueue* LinkQueue_Create();
void LinkQueue_Destroy(LinkQueue* queue);
void LinkQueue_Clear(LinkQueue* queue);
int LinkQueue_Append(LinkQueue* queue, void* item);
void* LinkQueue_Retrieve(LinkQueue* queue);
void* LinkQueue_Header(LinkQueue* queue);
int LinkQueue_Length(LinkQueue* queue);
#endif
//c文件1-链表的api函数的实现
#include<iostream>
#include"LinkList.h"
using namespace std;
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}TLinkList;
LinkList* LinkList_Create()
{
TLinkList* tmp = NULL;
tmp = (TLinkList*)malloc(sizeof(TLinkList));
if (tmp == NULL)
{
cout << "LinkList_Create() error" << endl;
return NULL;
}
memset(tmp, 0, sizeof(TLinkList));
return tmp;
}
void LinkList_Destroy(LinkList* list)
{
if (list == NULL)
{
return;
}
free(list);
return;
}
void LinkList_Clear(LinkList* list)
{
TLinkList* tlist = NULL;
tlist = (TLinkList*)list;
if (tlist == NULL)
{
return;
}
tlist->header.next = NULL;
tlist->length = 0;
return;
}
int LinkList_Length(LinkList* list)
{
TLinkList* tlist = NULL;
tlist = (TLinkList*)list;
if (tlist == NULL)
{
return -1;
}
return tlist->length;
}
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
int i = 0;
LinkListNode *pcur=NULL;
TLinkList* tList = NULL;
tList = (TLinkList*)list;
pcur = &(tList->header);
if (list == NULL || node == NULL || pos < 0)
{
return -1;
}
for (i = 0; i < pos; i++)
{
pcur = pcur->next;
}
node->next = pcur->next;
pcur->next = node;
tList->length++;
return 0;
}
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
int i = 0;
LinkListNode* pcur = NULL;
TLinkList* tList = NULL;
tList = (TLinkList*)list;
pcur = &(tList->header);
if (list == NULL || pos < 0)
{
return NULL;
}
for (i = 0; i < pos; i++)
{
pcur = pcur->next;
}
return pcur->next;
}
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
int i = 0;
LinkListNode* pcur = NULL;
LinkListNode* ret = NULL;
TLinkList* tlist=NULL;
tlist = (TLinkList*)list;
pcur = &(tlist->header);
if (list == NULL || pos < 0)
{
return NULL;
}
for (i = 0; i < pos; i++)
{
pcur = pcur->next;
}
ret=pcur->next;
pcur->next = ret->next;
tlist->length--;
//free(ret);
return ret;
}
//c文件2-链式队列的api函数的实现
#include<iostream>
using namespace std;
#include"LinkQueue.h"
#include"LinkList.h"
//����һ�������൱�ڴ���һ�����Ա�
LinkQueue* LinkQueue_Create()
{
return LinkList_Create();
}
void LinkQueue_Destroy(LinkQueue* queue)
{
LinkQueue_Clear(queue);
LinkList_Destroy(queue);
return ;
}
void LinkQueue_Clear(LinkQueue* queue)
{
while (LinkList_Length(queue)>0)
{
LinkQueue_Retrieve(queue);
}
return ;
}
//�����β������Ԫ�أ��൱����������β������Ԫ�أ���Ҫ�Ѷ��еĽڵ�����������Ľڵ㣬Ȼ����뵽��������
typedef struct _tag_LinkQueueNode
{
LinkListNode node;
void* item;
}TLinkQueueNode;
int LinkQueue_Append(LinkQueue* queue, void* item)
{
int ret = 0;
TLinkQueueNode* tmp = NULL;
tmp = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
if (tmp == NULL)
{
return -1;
}
tmp->item = item;
ret=LinkList_Insert(queue, (LinkListNode*)tmp, LinkList_Length(queue));
if (ret != 0)
{
cout << "func LinkList_Insert() error" << endl;
free(tmp);
return ret;
}
return ret;
}
//ɾ������ͷ��Ԫ��
void* LinkQueue_Retrieve(LinkQueue* queue)
{
TLinkQueueNode* tmp = NULL;
void* item = NULL;
tmp = (TLinkQueueNode*)LinkList_Delete(queue, 0);//�ӵ�0��λ�õ�ָ�룬������Ҫ�ͷ�
if (tmp == NULL)
{
return NULL;
}
item = tmp->item;
free(tmp);//��Ҫ���dz�����ʱ���ڵ��ͷ�
return item;
}
void* LinkQueue_Header(LinkQueue* queue)
{
TLinkQueueNode* tmp = NULL;
tmp = (TLinkQueueNode*)LinkList_Get(queue, 0);
if (tmp == NULL)
{
return NULL;
}
return tmp->item;
}
int LinkQueue_Length(LinkQueue* queue)
{
return LinkList_Length(queue);
}
//c文件3-队列的上层测试函数
#include<iostream>
using namespace std;
#include"LinkQueue.h"
int main()
{
int a[10], i = 0;
LinkQueue* queue = NULL;
for (i = 0; i < 10; i++)
{
a[i] = i + 1;
}
queue = LinkQueue_Create();
for (i = 0; i < 10; i++)
{
LinkQueue_Append(queue, &a[i]);
}
//获取队列的属性
cout << "lenght: "<<LinkQueue_Length(queue);
cout << endl;
cout << "header: "<< *((int*)LinkQueue_Header(queue));
cout << endl;
//出队列
while (LinkQueue_Length(queue)>0)
{
int tmp = *(int*)LinkQueue_Retrieve(queue);
cout << tmp << " ";
}
LinkQueue_Destroy(queue);
}
运行结果: