순서 대기 열과 체인 대기 열 은 입 대기 열, 출 대기 열, 취 대기 열 첫 번 째 요 소 를 실현 합 니 다.

먼저 대열 의 특징 을 분명히 해 야 한다. 먼저 나 가 야 한다.
1. 순서 대기 열
팀 의 끝 에 꽂 고 머리 가 나 오 는 동시에 순서 스 택 과 같 으 므 로 동적 으로 메모 리 를 신청 해 야 합 니 다.
#pragma once

#include

typedef char ListQueueType;

typedef struct ListQueue
{
    ListQueueType* data;
    int size;//    
    int capacity;//    
    int head;// 
    int tail;// 
}ListQueue;


void Init(ListQueue* queue);//   

void Destory(ListQueue* queue);//    

void Expansion(ListQueue* queue);//  

void Push(ListQueue* queue,ListQueueType value);//    

void Pop(ListQueue* queue);   

int front(ListQueue* queue,ListQueueType* value);//    
#include
#include"queue.h"
#include

void Init(ListQueue* queue)
{
    if(queue == NULL)
    {
        //    
        return;
    }
    queue->size = 0;
    queue->capacity = 1000;
    queue->head = 0;
    queue->tail = 0;
    queue->data = (ListQueueType*)malloc(sizeof(ListQueueType)*(queue->capacity));
    return;
}


//  
void Destory(ListQueue* queue)
{
    if(queue == NULL)
    {
        return;
    }
    free(queue->data);
    queue->size = 0;
    queue->capacity = 0;
    queue->head = 0;
    queue->tail = 0;
    return;
}



//  
void Expansion(ListQueue* queue)
{
    if(queue == NULL)
    {
        return;
    }
    queue->capacity = queue->capacity*2+1;//          
    ListQueueType* New_data = (ListQueueType*)malloc
        (sizeof(ListQueueType)*(queue->capacity));

    //          
    //     (head tail     )
    if(queue->head < queue->tail)//head   
    {
        int i = 0;
        for (;isize;++i)
        {
            New_data[i] = queue->data[i];
        }
        
    }
    else//tail  
    {
        int i = queue->head;
        for(;isize;++i)
        {
            New_data[i] = queue->data[i];
        }
        i = 0;
        for(;itail;++i)
        {
            New_data[queue->size+i] = queue->data[i];
        }
        queue->tail = queue->head + queue->size;//  tail   
    }
    free(queue->data);
    queue->data = New_data;
    return;
}

//  
void Push(ListQueue* queue,ListQueueType value)
{
    if(queue == NULL)
    {
        return;
    }
    if(queue->size >= queue->capacity)//     ,      
    {
        Expansion(queue);
    }
    if(queue->tail == queue->capacity)
    {
        queue->tail = 0;
        queue->data[queue->tail++] = value;
        queue->size++;
        return;
    }
    queue->data[queue->tail++] = value;
    queue->size++;
    return;
}



//  
void Pop(ListQueue* queue)
{
    if(queue == NULL)
    {
        return;
    }
    if(queue->size == 0)
    {
        printf("NULL
"); return; } if(queue->head == queue->capacity-1) { queue->head = 0; queue->size--; } else { ++queue->head; --queue->size; if(queue->size == 0) { printf("size = 0
"); } } return; }
int front(ListQueue* queue,ListQueueType* value)
{
    if(queue == NULL || value == NULL)
    {
        return -1;
    }
    if(queue->size == 0)
    {
        value = NULL;
        return -1;
    }
    *value = queue->data[queue->head];
    return 0;
}

자신 이 쓴 데 이 터 를 보기 위해 서 여기에 인쇄 를 했 으 니 스스로 테스트 해 볼 수 있 습 니 다.
void Print(ListQueue* queue)
{
    if(queue == NULL)
    {
        printf("     
"); return; } int i = 0; for(;isize;++i) { printf("[%c]\t",queue->data[i]); } printf("
"); }

2. 체인 대기 열
끝 노드 가 대열 에 들 어가 면 머리 노드 가 대열 에 나온다.
stack.h

#pragma once 

#include

typedef char LinkQueueType;

typedef struct LinkQueueNode
{
    LinkQueueType data;
    struct LinkQueueNode* next;
}LinkQueueNode;

typedef struct LinkQueue
{
    LinkQueueNode* head;
    LinkQueueNode* tail;
}LinkQueue;


void Init(LinkQueue* queue);//   

void Destory(LinkQueue* queue);//  

LinkQueueNode* CreatedNode(LinkQueueType value);//      

void Push(LinkQueue* queue,LinkQueueType value);//     

void Pop(LinkQueue* queue);//     

int Front(LinkQueue* queue,LinkQueueType* value);//    
#include
#include"queue.h"
#include

void Init(LinkQueue* queue)
{
    if(queue == NULL)
    {
        return;
    }
    queue->head = NULL;
    queue->tail = NULL;
}

void DestoryNode(LinkQueueNode* Node)//    
{
    free(Node);
    return;
}

LinkQueueNode* CreatedNode(LinkQueueType value)//    
{
    LinkQueueNode* node = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
    node->data = value;
    node->next = NULL;
    return node;
}

void Push(LinkQueue* queue,LinkQueueType value)
{
    if(queue == NULL)
    {
        return;
    }
    LinkQueueNode* node = CreatedNode(value);
    if(queue->head == NULL)
    {
      queue->head = queue->tail = node;
    }
    else
    {
        queue->tail->next = node;
        queue->tail = queue->tail->next;
    }
    return;
}

void Pop(LinkQueue* queue)
{
    if(queue == NULL)
    {
        return;
    }
    if(queue->head == NULL)
    {
        printf("   
");         return;     }     LinkQueueNode* to_delete = queue->head;     queue->head = to_delete->next;     DestoryNode(to_delete);     return; }
int Front(LinkQueue* queue,LinkQueueType* value)
{
    if(queue == NULL || value == NULL)
    {
        return -1;
    }
    if(queue->head == NULL)
    {
        printf("   
");         return -1;     }     *value = queue->head->data;     return 0; }
void Destory(LinkQueue* queue)
{
   if(queue == NULL)
    {
        return;
    }
    LinkQueueNode* to_delete = queue->head;
    while(to_delete != NULL)
    {
        LinkQueueNode* next = to_delete->next;
        DestoryNode(to_delete);
        to_delete = next;
    }
    queue->head = NULL;
    queue->tail = NULL;
    return;
}

좋은 웹페이지 즐겨찾기