数据结构之串笔记

来源:互联网 发布:为什么喜欢生物 知乎 编辑:程序博客网 时间:2024/06/06 09:40

//顺序队列的类型定义如下:

#define maxsize 1024

typedef struct

{

    int data[maxsize];

    int rear,front;

}sequeue;

//定义一个指向队列的指针变量sequeue *q

//申请顺序队列的存储空间q=(sequeue*)malloc(sizeof(sequeue));

//空队时q->rear=q->front=-1;

//入队列q->rear++;q->data[q->rear]=x;

//出队列q->front++;x=q->data[q->front];//队头指针指向的是队头元素的前面一个位置,就是队头指针没有指向第一个队头元素,但是队尾指针指向的是最后一个队列尾元素,从这一点来看队列头指针与队列尾指针是有点不同的

//队列中元素个数m=(q-<rear)-(q->front);

//队列就是队列头部出去元素,队列尾部进入元素

//顺序队列会有假溢出的情况,那么构建循环队列就是非常必要的了

typedef struct

{

    int data[maxsize];

    int front,rear;

    int num;//队列中间元素的个数

}csequeue;//循环队列的定义

csqueue *init_sequeue()

{

    q=(csequeue*)malloc(sizeof(csequeue));//q队列申请存储空间

    q->rear=q->front=maxsize-1;

    q->num=0;

    return q;

}//构建空的循环队列

int in_sequeue(csequeue *q,int x)

{

    if(q->num==maxsize-1)

    {

        printf("队满\n");

        return -1;

    }

    else

    {

        q->rear=(q->rear+1)%maxsize;

        q->data[q->rear]=x;

        q->num++;

        return 1;

    }

}//入循环队列

int out_sequeue(csequeue *q,int *x)

{

    if(q->num==0)

    {

        printf("队空\n");

        return -1;

    }

    else

    {

        q->front=(q->front+1)%maxsize;

        *x=q->data[q->front];

        q->num--;

        return 1;

    }

}//出循环队列

int empty_sequeue(csequeue *q)

{

    if(q->num==0)

        return 1;

    else

        return 0;

}//判断循环队列是不是空

//////////////////////////////////////////////////////////

typedef struct

{

    int data;

    struct node *next;

}qnode;//单链表按照队列的操作来的话就是链队列

typedef struct

{

    qnode *front,*rear;

}lqueue;//把指向链队列的头指针与尾指针封装在一起

//定义指向链队的指针lqueue *q

lqueue *init_lqueeu()

{

    lqueue *q;//定义头尾指针的封装结点

    qnode *p;//定义链队列的头结点

    q=(lqueue*)malloc(sizeof(lqueue));//申请存储空间

    p=(qnode*)malloc(sizeof(lqueue));//同上

    p->next=NULL;

    q->front=p;

    q->rear=p;

    return p;

}//置一个空链队列

void in_lqueue(lqueue *q,int x)

{

    qnode *p;

    p=(qnode*)malloc(sizeof(qnode));

    p->data=x;

    p->next=null;

    q->rear->next=p;

    q->rear=p;

}//链队列入队列

int out_lqueue(lqueue *q,int *x)

{

    qnode *p;

    if(empty_lqueue(q))

    {

        printf("队列空\n");

        return 0;

    }

    else

    {

        p=q->front->next;

        q-front->next=p->next;

        *x=p->data;

        free(p);

        if(q->front->next==NULL)

        {

            q->rear=q->front;

            return 1;

        }

    }

}//链队出队列算法