数据结构——链式队列的实现

认识链式队列

利用数组实现了循环队列,这是静态的队列,缺点是需要预设大小,当队列满时,无法再插入新的数据,只有等队头的数据被取走以后才能往队列放入新的数据。

还可以利用链表实现队列,这种方式动态创建节点需要的内存,当有新的数据节点要加入时,才去申请内存空间,不需要预设大小,整个队列需要的内存空间不需要连续,并且插入删除更容易实现。但是同时也带来存取速度慢的缺点,操作也比数组的方式更加复杂。

其实用链表实现队列的方式十分简单,只需要在单链表的基础上,增加一个尾指针即可。因为队列的特点是“先进先出”,因此我们只需要在一头一尾两个指针,就可以快速地在队头取出数据,在队尾插入数据。
对于队列的基本的操作主要有以下几种操作:

  • 初始化
  • 出队列
  • 入队列
  • 销毁
  • 取队首元素

test.h

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include 
#include 


typedef char LinkQType;

typedef struct LinkQNode{
    LinkQType data;
    struct LinkQNode* next;
}LinkQNode;
typedef struct LinkQ{
    LinkQNode* head;//不带头结点
    LinkQNode* tail;
}LinkQ;

void LinkQInit(LinkQ* sq);
void LinkQPrint(LinkQ* sq, const char* msg);
void  LinkQDestroy(LinkQ* sq);
LinkQNode* LinkQPush(LinkQ* sq, LinkQType value);
LinkQType*  LinkQPop(LinkQ*  sq);
int LinkQTop(LinkQ* sq, LinkQType* value);

test.c及测试函数

#define _CRT_SECURE_NO_WARNINGS
#include "test.h"

void LinkQInit(LinkQ* sq){
    if (sq == NULL){
        return;
    }
    sq->head = NULL;
    sq->tail = NULL; 
}
void LinkQPrint(LinkQ* sq, const char* msg){
    printf("[%s]\n", msg);
    if (sq == NULL){
        return;
    }
    LinkQNode* cur = sq->head;
    for (; cur!= NULL; cur = cur->next){
        printf("[%c|%p]\n", cur->data);
    }
    printf("\n");
}
void LinkQDestroy(LinkQ* sq){
    free(sq->head);
    free(sq->tail);
}
LinkQNode*  CreateNode( LinkQType value){
    LinkQNode * newnode = (LinkQNode*)malloc(sizeof(LinkQNode));
    newnode->data = value;
    newnode->next = NULL;
    return newnode;
}

LinkQNode* LinkQPush(LinkQ* sq, LinkQType value){
    if (sq == NULL){
        return NULL;
    }
    LinkQNode* newnode = CreateNode(value);
    if (sq->head == NULL){
        sq->head = sq->tail = newnode;
    }
    sq->tail->next = newnode;
    sq->tail = sq->tail->next;
    return sq->head;
}

LinkQType*  LinkQPop(LinkQ*  sq){
    if (sq == NULL){
        return;
    }
    if (sq->head == NULL){
        //空链表
        return;
    }
    sq->head = sq->head->next;
    //一个节点
    /*if (sq->head == sq->tail){
        sq->head = sq->tail = NULL;
        return;
        }*/
    //多个节点
    /*LinkQNode* to_delete = sq->head;
    sq->head= to_delete->next;
    LinkQDestroy(to_delete);
    }*/
}
int LinkQTop(LinkQ* sq, LinkQType* value){
    if (sq == NULL||value==NULL){
        return 0;
    }
    if (sq->head == NULL){
        //队列为空
        return 0;
    }
    *value = sq->head->data;
    return *value;
}

//////////////////////////////////////////////
/////////////////////test.c//////////////////
////////////////////////////////////////////
#define TEST_HEADER printf("\n=========%s=========\n",__FUNCTION__);
void test1(){
    TEST_HEADER;
    LinkQ *sq;
    LinkQInit(&sq);
    LinkQPush(&sq, 'f');
    LinkQPush(&sq, 'b');
    LinkQPush(&sq, 'c');
    LinkQPush(&sq, 'd');
    LinkQPrint(&sq, "入队列四个元素");
    LinkQType value;
    LinkQTop(&sq, &value);
    printf("%c\n", value);
    LinkQPop(&sq);


    /*LinkQTop(&sq, &value);
    printf("%c\n", value);
    LinkQPop(&sq);


    LinkQTop(&sq, &value);
    printf("%c\n", value);
    LinkQPop(&sq);


    LinkQTop(&sq, &value);
    printf("%c\n", value);
    LinkQPop(&sq);*/
}

int main(){


    test1();
    //test2();
    //test3();
    getchar;
    return;
}

你可能感兴趣的:(数据结构)