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

来源:互联网 发布:怎么在知乎提问 编辑:程序博客网 时间:2024/06/06 08:30

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

list.h

#pragma oncetypedef 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 <stdio.h>#include <stdlib.h>#include <string.h>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;}
原创粉丝点击