赞
踩
队列也是一种特殊的线性表,队列相比于链表,是在链表的一端插入元素,另外一端取出元素,遵循“先进先出”的原则,与栈相反,队列的存储也用到了链表的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); }
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。