循环队列的双循环链表结构

运行环境Visual studio 2017
运行平台Windows 7

list.h

#pragma once
typedef int Elemtype;
typedef enum{OK=1,ERROR=0}Status;
typedef struct coord {
    int x;/*abscissa(横坐标)*/
    int y;/*ordinate(纵坐标)*/
}Coord;
enum Direction{up = 1,down ,left ,right  };


typedef struct elements {
    Coord coord;/*坐标*/
    enum Direction direction;/*下一步的方向*/
};
typedef struct list
{
    Elemtype data;
    struct list* prev;
    struct list* next;
}List, *Ptrlist;

typedef struct queue
{
    Ptrlist  front;
    Ptrlist  tail;
    int cursize;
}Queue;

Status Initqueue(Queue &Lq);
Status Clear(Queue &Lq);
Status Destroy(Queue &Lq);
bool Queueempty(Queue &Lq);
int Queuelength(Queue &Lq);
Status Getfront(Queue &Lq,Elemtype &x);
Status Gettail(Queue &Lq,Elemtype &x);
Status push_front(Queue &Lq, Elemtype x);
Status push_tail(Queue &Lq, Elemtype x);
void Showqueue(Queue &Lq);



list.cpp

#include "list.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

void Freenode(Ptrlist p)
{
    free(p);
    p = NULL;
}
Ptrlist Buynode()
{
    Ptrlist s = (Ptrlist)malloc(sizeof(List));
    if (s == NULL) exit(0);

    memset(s, 0, sizeof(List));
    return s;
}
Status Initqueue(Queue &Lq)
{
    Lq.cursize = 0;

    Lq.tail = NULL;
    Lq.front = Lq.tail;


    return OK;
}
Status Clear(Queue &Lq)
{
    while (Lq.front->next != Lq.front->prev)
    {
        Ptrlist p = Lq.front;
        Freenode(p);
        Lq.front = Lq.front->next;
    }
    Ptrlist q = Lq.front;
    Freenode(q);
    Lq.front = Lq.tail = NULL;
    Lq.cursize = 0;
    return OK;

}
Status Destroy(Queue &Lq)
{
    Clear(Lq);
    Freenode(Lq.front);
    Freenode(Lq.tail);
    return OK;
}
bool Queueempty(Queue &Lq)
{
    return (Lq.cursize == 0);
}
int Queuelength(Queue &Lq)
{
    return Lq.cursize;
}
Status Getfront(Queue &Lq,Elemtype &x)
{
    if (Queueempty(Lq))
    {
        return ERROR;
    }
    else
    {
        x = Lq.front->data;
        return OK;
    }
}
Status Gettail(Queue &Lq,Elemtype &x)
{
    if (Queueempty(Lq))
    {
        return ERROR;
    }
    else
    {
        x = Lq.tail->data;
        return OK;
    }
}
Status push_front(Queue &Lq, Elemtype x)
{
    Ptrlist s = Buynode();
    if (Lq.front == NULL)
    {
        Lq.front = s;
        Lq.tail = Lq.front;
        Lq.tail->next = Lq.front;
        Lq.tail->prev = Lq.front;
        Lq.front->next = Lq.tail;
        Lq.front->prev = Lq.tail;
        s->data = x;
        Lq.cursize++;
        return OK;
    }
    s->prev = Lq.front->prev;
    Lq.front->prev->next = s;
    Lq.front->prev = s;
    s->next = Lq.front;

    s->data = x;
    Lq.cursize++;
    Lq.front = s;
    return OK;
}
Status push_tail(Queue &Lq, Elemtype x)
{
    Ptrlist s = Buynode();
    if (Lq.tail == NULL)
    {
        Lq.tail = s;
        Lq.front = Lq.tail;
        Lq.tail->next = Lq.front;
        Lq.tail->prev = Lq.front;
        Lq.front->next = Lq.tail;
        Lq.front->prev = Lq.tail;
        s->data = x;
        Lq.cursize++;
        return OK;
    }
    s->prev = Lq.front->prev;
    Lq.front->prev->next = s;
    Lq.front->prev = s;
    s->next = Lq.front;

    s->data = x;
    Lq.cursize++;
    Lq.tail = s;
    return OK;
}
Status Pop_front(Queue &Lq)
{
    if (Queueempty(Lq))
    {
        return ERROR;
    }
    Ptrlist p = Lq.front;
    Lq.front->next->prev = Lq.front->prev;
    Lq.front->prev->next = Lq.front->next;
    Lq.front = Lq.front->next;
    Freenode(p);
    Lq.cursize--;
    return OK;
}
Status Pop_tail(Queue &Lq)
{
    if (Queueempty(Lq))
    {
        return ERROR;
    }
    Ptrlist p = Lq.tail;
    Lq.tail->prev->next = Lq.tail->next;
    Lq.tail->next->prev = Lq.tail->prev;
    Lq.tail = Lq.tail->prev;
    Freenode(p);
    Lq.cursize--;
    return OK;
}

void Showqueue(Queue &Lq)
{
    Ptrlist p = Lq.front;
    while (p->next != Lq.tail)
    {
        printf("%d,", p->data);
    }
    printf("\n");
}

主函数(对于函数模块可以自己添加进去进行测试)
main.c

#include "list.h"
#include 
#include 
#include 


int main()
{
    Queue myq;
    Initqueue(myq);
    Elemtype data[3] = { 11,22,33 };
    Elemtype out[3] ;
    push_front(myq, data[0]);
    push_tail(myq, data[1]);
    push_front(myq, data[2]);
    Status Getfront(myq,out[0]);
     Status Gettail(myq,out[1]);
     Status Getfront(myq,out[2]);

    return 0;
}

你可能感兴趣的:(数据结构与算法,队列的应用)