测试框架
#include<stdlib.h> #include<string.h> #include<iostream> #include"LinkQueue.h" void main() { //LinkQueue* Queue_Create(); //void Queue_Destroy(LinkQueue* queue); //void Queue_Clear(LinkQueue* queue); //int Queue_Append(LinkQueue* queue, void* item); //void* Queue_Retrieve(LinkQueue* queue); //void* Queue_Header(LinkQueue* queue); //int Queue_Lenght(LinkQueue* queue); int i, a[10]; LinkQueue* queue = NULL; queue = Queue_Create(); if (queue==NULL) { return; } for ( i = 0; i < 5; i++) { a[i] = i + 1; Queue_Append(queue,&a[i]); } //求队列的属性 printf("len : %d",Queue_Lenght(queue)); printf("header : %d", *(int*)Queue_Header(queue)); //出队列 while (Queue_Lenght(queue)) { int tmp; tmp = *(int*)Queue_Retrieve(queue); printf("tmp : %d", tmp); } Queue_Destroy(queue); }
头文件:
LinkQueue.h
#pragma once typedef void LinkQueue; LinkQueue* Queue_Create(); void Queue_Destroy(LinkQueue* queue); void Queue_Clear(LinkQueue* queue); int Queue_Append(LinkQueue* queue,void* item); void* Queue_Retrieve(LinkQueue* queue); void* Queue_Header(LinkQueue* queue); int Queue_Lenght(LinkQueue* queue);
//实现
#include<stdlib.h> #include<string.h> #include<iostream> #include"LinkQueue.h" #include"linklist.h"
//队列也是一个特殊的线性表 //队列的业务节点的数据结构 typedef struct LinkQueueNode { LinkListNode node; void* item; }; //创建队列相当于销毁线性表 LinkQueue* Queue_Create() { return List_Create(); } //销毁队列相当于销毁线性表 //节点的额内存管理 void Queue_Destroy(LinkQueue* queue) { Queue_Clear(queue); List_Destory(queue);
} //清空队列 需要显示的把队列的所有节点搞出来 //释放每一个结点 void Queue_Clear(LinkQueue* queue) { while (List_Length(queue)>0) { Queue_Retrieve(queue); } List_Clear(queue); return ; } //向队列添加元素相当于向线性表的尾部添加元素 int Queue_Append(LinkQueue* queue, void* item) { int ret; LinkQueueNode* tmp = NULL; tmp = (LinkQueueNode*)malloc(sizeof(LinkQueueNode)); if (tmp==NULL) { return -1; } memset(tmp,0,sizeof(LinkQueueNode)); tmp->item = item; //需要把栈的item(栈的业务结点)转化成线性表的LinkListNode
ret= List_Inster(queue,(LinkListNode*)tmp,List_Length(queue)); if (ret!=0) { if (tmp != NULL) { free(tmp); } return ret; }
return ret; } //从队列中删除元素 相当于从线性表的头部删除元素 void* Queue_Retrieve(LinkQueue* queue) { //int ret = 0; LinkQueueNode* tmp; void* ret = NULL; tmp = (LinkQueueNode*)List_Delete(queue, 0); if (tmp==NULL) { return NULL; } //删除之前缓存 ret = tmp->item; if (tmp!=NULL) { free(tmp); } return ret; }
//获取队列头部元素相当于从线性表的0号位置拿取数据 void* Queue_Header(LinkQueue* queue) { LinkQueueNode* tmp;
tmp = (LinkQueueNode*)List_Get(queue, 0); if (tmp == NULL) { return NULL; }
return tmp->item; } //球队列的长度相当于求线性表的长度 int Queue_Lenght(LinkQueue* queue) { return List_Length(queue); }
linklist.h
#pragma once #ifdef _MYLIST_H_ #define _MYLIST_H_ #endif // _MYSEQLIST_H_ typedef void Linklist; typedef struct LinkListNode { struct LinkListNode* next; }; /*创建列表*/ Linklist * List_Create(); /*释放列表*/ void List_Destory(Linklist* list); /*清空列表 回到初始状态*/ void List_Clear(Linklist* list); /*获取链表的长度*/ int List_Length(Linklist* list); /*获取指定位置的链表的元素数据*/ LinkListNode* List_Get(Linklist* list, int pos); /*插入元素数据*/ int List_Inster(Linklist* list, LinkListNode* node, int pos); /*元素数据删除*/ LinkListNode* List_Delete(Linklist* list, int pos);
//实现
#include"linklist.h" #include<stdio.h> #include<stdlib.h> #include<string.h>
typedef struct TLinkList { LinkListNode header; int lenght; }; /*创建列表*/ Linklist * List_Create() { TLinkList* ret = NULL; ret = (TLinkList*)malloc(sizeof(TLinkList)); memset(ret,0,sizeof(TLinkList)); ret->lenght = 0; ret->header.next = NULL; return ret; } /*释放列表*/ void List_Destory(Linklist* list) { if (list==NULL) { free(list); list = NULL; } return ; } /*清空列表 回到初始状态*/ void List_Clear(Linklist* list) { TLinkList *tlist = NULL; if (list==NULL) { return; } tlist = (TLinkList*)list; tlist->lenght = 0; tlist->header.next = NULL; return ; } /*获取链表的长度*/ int List_Length(Linklist* list) { TLinkList* tlist = NULL; if (list == NULL) { return 0; } tlist = (TLinkList*)list;
return tlist->lenght; } /*获取指定位置的链表的元素数据*/ LinkListNode* List_Get(Linklist* list, int pos) { int i = 0; if (list==NULL||pos<0) { return NULL; } LinkListNode* current = NULL; TLinkList* tlist = NULL; tlist = (TLinkList*)list; current = &(tlist->header); //让辅助指针指向链表的头部 for ( i = 0; i < pos&&(current->next!=NULL); i++) { current = current->next; } return current->next; } /*插入元素数据*/ int List_Inster(Linklist* list, LinkListNode* node, int pos) { if (list == NULL || pos<0||node==NULL) { return 0; } int i = 0, ret = 0; TLinkList* tlist = NULL; tlist = (TLinkList*)list; LinkListNode* current = NULL; current = &(tlist->header); for ( i = 0; i < pos&&(current->next!=NULL); i++) { current = current->next; } node->next = current->next; current->next = node; tlist->lenght++; return 0; } /*元素数据删除*/ LinkListNode* List_Delete(Linklist* list, int pos) { int i = 0; if (list == NULL || pos<0 ) { return 0; } TLinkList* tlist = NULL; LinkListNode* current = NULL; tlist = (TLinkList*)list; current = &(tlist->header); LinkListNode* ret = NULL; for ( i = 0; i <pos&&(current->next!=NULL); i++) { current = current->next; } ret = current->next; current->next = ret->next; tlist->lenght--; return ret; }