1. 程式人生 > >資料結構---線性表(鏈式佇列)

資料結構---線性表(鏈式佇列)

LinkQueue.h

#ifndef __LINKQUEUE__H_
#define __LINKQUEUE__H_

//一些庫函式的標頭檔案包含
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
 
//自定義bool
typedef int Boolean;
 
//定義函式返回狀態
typedef int Status;
 
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef struct Node
{
	int data;
	struct Node *next;
}LNode,*PNode;

typedef struct queue
{
    PNode front;  //佇列頭指標
    PNode rear;   //佇列尾指標
}Queue;

/* 初始化 */
Status init(Queue *que);

/* 銷燬 */
Status destroy(Queue *que);

/* 重置 */
Status clear(Queue *que);

/* 判空 */
Boolean isEmpty(Queue que);

/* 獲取已存元素的數量 */
int listLen(Queue que);

/* 獲取佇列頭元素 */
Status getFront(Queue que, int *front);

/* 入隊 */
Status inQue(Queue *que, int elem);

/* 出隊 */
Status outQue(Queue *que, int *out_elem);

/* 根據給定關係改變元素的值 */
Status traverse(Queue que, void (*vi)(int *) );

#endif

LinkQueue.c

#include "LinkQueue.h"

/* 初始化 */
Status init(Queue *que)
{
    PNode p;
    p = (PNode)malloc(sizeof(LNode));
    if(!p)
    {
        printf("動態記憶體分配失敗");
        exit(-1);
    }

    (*que).front = p;
    (*que).rear = p;
    (*que).front->next = NULL;
    return OK;
}

/* 銷燬 */
Status destroy(Queue *que)
{
    PNode p;
    while(que->front)
    {
        p = que->front->next;
        free(que->front);
        que->front = p;
    }
    return OK;
}

/* 重置 */
Status clear(Queue *que)
{
    PNode q,p = que->front->next;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    
    que->rear = que->front;
    que->front->next = NULL;
    return OK;
}

/* 判空 */
Boolean isEmpty(Queue que)
{
    if(que.front == que.rear)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/* 獲取已存元素的數量 */
int listLen(Queue que)
{
    int i = 0;
    PNode p = que.front->next;
    while(p)
    {
        i++;
        p = p->next;
    }
    
    return i;
}

/* 獲取佇列頭元素 */
Status getFront(Queue que, int *front)
{
    PNode p = que.front->next;

    //if(!p)
    //{
    //    return ERROR;
    //}

    if(que.front == que.rear)
    {
        return ERROR;
    }

    *front = p->data;
    return OK;
    
}

/* 入隊 ,在隊尾插入元素*/
Status inQue(Queue *que, int elem)
{
    PNode p = (PNode)malloc(sizeof(LNode));
    p->data = elem;
    p->next = NULL;

    que->rear->next = p; //把尾結點的指標域設定為新結點
    que->rear = p;  //把佇列尾指標設定為新結點
    return OK;
}

/* 出隊 ,在隊頭刪除元素*/
Status outQue(Queue *que, int *out_elem)
{
    PNode p = que->front->next; //獲取首結點
    if(que->front == que->rear)
    {
        return ERROR;
    }
    que->front->next = p->next; //吧頭結點的指標域設定為首結點的下個結點
    *out_elem = p->data;

    if(que->rear == p)//如果只有一個有效結點
    {
        que->rear = que->front;
    }

    free(p);
    p = NULL;
    return OK;
}

/* 根據給定關係改變元素的值 */
Status traverse(Queue que, void (*vi)(int *) )
{
    PNode p = que.front->next;
    while(p)
    {
        vi(&p->data);
        p = p->next;
    }
    printf("\n");
    return OK;
}