數據結構-隊列的鏈式存儲(10)

測試框架

#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; }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章