測試框架
#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;
}