您的位置:首页 > 理论基础 > 数据结构算法

一步一步学数据结构之1--1(队列--线性表实现--不存在循环)

2013-08-06 11:37 260 查看
        队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

   

  这次给大家介绍用线性表实现的队列,且不存在循环。

   

  如图



 

这里介绍双向链表的常用操作:

  

        创建队列

        销毁队列

        清空队列

        入队

        出队

        返回队首元素

        返回队的大小

        返回队的最大长度

  

  代码总分为三个文件:

            LinkStack.h : 放置功能函数的声明,以及表的声明

            LinkStack.c : 放置功能函数的定义

            Main.c     : 主函数,使用功能函数完成各种需求,一般用作测试

  

  整体结构图为:

  
              


  这里详细说下入队操作,出队操作和返回队首元素操作:

 

     


       因为线性表的任意表元素可以直接获取,而且入队,出队都会移动表元素。且获取队首元素可以直接获取,不用进行遍历,所以表头作队头﹑队尾都可以,表尾同理。

  OK! 上代码:

  

          SeqQueue.h :

             

#ifndef _SEQQUEUE_H_
#define _SEQQUEUE_H_

typedef void SeqQueue;

SeqQueue* SeqQueue_Create(int capacity);

void SeqQueue_Destroy(SeqQueue* queue);

void SeqQueue_Clear(SeqQueue* queue);

int SeqQueue_Append(SeqQueue* queue, void* item);

void* SeqQueue_Retrieve(SeqQueue* queue);

void* SeqQueue_Header(SeqQueue* queue);

int SeqQueue_Length(SeqQueue* queue);

int SeqQueue_Capacity(SeqQueue* queue);

#endif


          SeqQueue.c :

#include "SeqList.h"
#include "SeqQueue.h"

SeqQueue* SeqQueue_Create(int capacity)
{
return SeqList_Create(capacity);
}

void SeqQueue_Destroy(SeqQueue* queue)
{
SeqList_Destroy(queue);
}

void SeqQueue_Clear(SeqQueue* queue)
{
SeqList_Clear(queue);
}

int SeqQueue_Append(SeqQueue* queue, void* item)
{
return SeqList_Insert(queue, (SeqListNode*)item, SeqList_Length(queue));
}

void* SeqQueue_Retrieve(SeqQueue* queue)
{
return SeqList_Delete(queue, 0);
}

void* SeqQueue_Header(SeqQueue* queue)
{
return SeqList_Get(queue, 0);
}

int SeqQueue_Size(SeqQueue* queue)
{
return SeqList_Length(queue);
}

int SeqQueue_Capacity(SeqQueue* queue)
{
return SeqList_Capacity(queue);
}


          Main.c     :

 

#include <stdio.h>
#include "SeqQueue.h"

int main(void)
{
SeqQueue* queue = SeqQueue_Create(20);

int a[10];
int i = 0;

for(i=0; i<10; i++)
{
a[i] = i;

SeqQueue_Append(queue, a+i);
}

printf("Header:     %d\n", *(int*)SeqQueue_Header(queue));
printf("Length:     %d\n", SeqQueue_Size(queue));
printf("Capacity:   %d\n", SeqQueue_Capacity(queue));

while(SeqQueue_Size(queue) > 0)
{
printf("%d ", *(int*)SeqQueue_Retrieve(queue));
}
printf("\n");

SeqQueue_Destroy(queue);

return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: