数据结构---链式队列实现

顾名思义,链式队列就是用链表的形式实现。与顺序队列的区别就是避免了空间溢出的问题。

还有就是顺序队列基本操作的空间复杂度都是O(1),而链式队列中插入操作的时间复杂度为O(n),因为要通过尾插和头删或头插和尾删来实现先进后出的规则。

  • 结构体声明
typedef char LinkListType;
typedef struct LinkListQueue{
    LinkListType data;
    struct LinkListQueue* next;//和单链表的定义一般
}LinkListQueue;
  • 具体函数声明
//创建节点
LinkListQueue* CreateNode(LinkListType value);

//初始化
void LinkListInit(LinkListQueue* head);

//销毁节点
void DestroyNode(LinkListQueue* node);

//入队列
void LinkListQueuePush(LinkListQueue** head,LinkListType value);

//出对列
void LinkListQueuePop(LinkListQueue** head);

//取队首元素
int LinkListQueueGetTop(LinkListQueue* head,LinkListType* value);
  • 具体函数实现

初始化和销毁,因为要改变外部指针的指向,所以要用二级指针接收,释放内存空间的话只要持有指向该内存空间的指针即可,释放完该空间后,外部指针应置空,避免野指针的问题

void LinkListInit(LinkListQueue** head)
{
    if(head == NULL)
    {   
        //非法输入
        return;
    }   
    *head = NULL;                                                                                                                     
}

void DestroyNode(LinkListQueue* node)
{
    free(node);
}

创建新节点

LinkListQueue* CreateNode(LinkListType value)
{
    LinkListQueue* newNode = (LinkListQueue*)malloc(sizeof(LinkListQueue));
    newNode->data = value;
    newNode->next = NULL;
    return newNode;
}

入队列和出队列

//尾插的基本操作
void LinkListQueuePush(LinkListQueue** head,LinkListType value)
{
    if(head==NULL)
    {
        //非法输入
        return;
    }
    if(*head==NULL)
    {
        //空队列
        *head = CreateNode(value);
        return;
    }
    LinkListQueue* cur = *head;
    while(cur->next!=NULL)
    {
        cur=cur->next;
    }
    cur->next = CreateNode(value);
}

//头删基本操作
{
    if(head==NULL)
    {
        //非法输入
        return;
    }
    if(*head==NULL)
    {
        //空队列
        return;
    }
    LinkListQueue* cur = *head;
    *head = (*head)->next;
    DestroyNode(cur);
    //该函数调用完cur指针便会销毁,所以我省去了置空步骤,但是如果之后会用到该指针的话,最好让其置空
}

取队首元素

int LinkListQueueGetTop(LinkListQueue* head,LinkListType* value)
{
    if(head==NULL)
    {
        //空队列
        return 0;
    }
    *value = head->data;
    return 1;
}

猜你喜欢

转载自blog.csdn.net/it_xiaoye/article/details/80296109