データ構造---チェーン式キューの実現

5422 ワード

名前の通り、チェーンの列はチェーンの形で実現されます.順番待ちとの違いは空間オーバーフローを避けることです.
また、順番待ちの基本的な操作の空間の複雑さは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);
    
  • 具体的な関数は
  • を実現します.
    初期化と廃棄は、外部ポインタの指向を変更するため、メモリ空間を2段階のポインタで受信し、メモリ空間を解放するには、メモリ空間に向けたポインタを持てばいいです.この空間を解放したら、外部ポインタを空にして、野針の問題を避けるべきです.
    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;
    }