第三章 队列【数据结构】【链队列】【循环队列】

来源:互联网 发布:淘宝神器返利是真的吗 编辑:程序博客网 时间:2024/05/18 04:58

 

最近越来越感觉到c语言指针的强大~~

#include<stdio.h>#include<stdlib.h>#define QElemType int#define OK 1#define ERROR 0#define OVERFLOW 0typedef int Status;//------------单链表------------队列的链式存储结构 typedef struct QNode {    QElemType data;    struct QNode *next;}QNode,*QueuePtr;typedef struct{    QueuePtr front,rear;//队头指针和队尾指针 }LinkQueue;//-----------------基本函数操作----------------- Status InitQueue(LinkQueue &Q,int n){    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//构造一个空队列     if(!Q.front)        exit(OVERFLOW);    Q.front->next = NULL;    printf("请输入n个数\n");    for(int i = 1; i <= n; i ++)//读入n个数,并依次加入队列     {        QueuePtr p = (QueuePtr)malloc(sizeof(QNode));        scanf("%d",&p->data);        p->next = NULL;        Q.rear->next = p;        Q.rear = p;    }    return OK;}//销毁队列Q Status DestroyQueue(LinkQueue &Q){    while(Q.front)    {        Q.rear = Q.front->next ;        free(Q.front);        Q.front = Q.rear ;    }    return OK;}//插入元素e为Q 的新的队尾元素 Status EnQueue(LinkQueue &Q,QElemType &e){    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));    if(!p)        exit(OVERFLOW);//存储分配失败     p->data = e;    p->next = NULL;    Q.rear->next = p;    Q.rear = p;    return OK;}//若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR Status DeQueue(LinkQueue &Q,QElemType &e){    if(Q.front == Q.rear )        return ERROR;    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));    p = Q.front->next ;    e = p->data ;    Q.front->next = p->next ;    free(p);    return OK;}void PrintQueue(LinkQueue *Q)//输出队列Q 中的元素 {    QueuePtr p = Q->front->next ;//将队列的头元素指针地址赋值给p     while(p!=NULL)    {        printf("%d ",p->data);        p = p->next ;    }    printf("\n");}int main() {    LinkQueue Q;    int n;    printf("请输入n\n");        scanf("%d",&n);//读入n个数,加入队列     InitQueue(Q,n);//初始化队列     printf("初始化后的队列为:\n");    PrintQueue(&Q);//输出队列中的元素         int e;    printf("请输入一个整数e\n");    scanf("%d",&e);//读入e     EnQueue(Q,e);//插入元素e为Q的新的队尾元素     printf("将e插入队尾后,队列更新为\n");    PrintQueue(&Q);//输出插入队尾后队列的值         DeQueue(Q,e);//删除Q的队头元素,用e返回其值     printf("删除队头元素后的队列为\n");    PrintQueue(&Q);//输出删除队头后的队列         DestroyQueue(Q);//销毁队列,释放存储空间     return 0;}

 循环队列的实现


#include<stdio.h>#include<stdlib.h>typedef int  QElemType;#define OVERFLOW 0#define MAXSIZE 1000typedef int Status;#define OK 1#define ERROR 0typedef struct {    QElemType *base;    int front;    int rear;}SqQueue;Status InitQueue(SqQueue &Q){    int n;    printf("请输入n\n");    scanf("%d",&n);    Q.base = (QElemType*)malloc(MAXSIZE*sizeof(QElemType));    if(!Q.base)        exit(OVERFLOW);    Q.front = Q.rear = 0;    printf("请输入n个元素\n");    for(int i = 0; i < n; i ++)    {        scanf("%d",&Q.base[i]);        Q.rear = (Q.rear +1)%MAXSIZE;    }    return OK;} int QueueLength(SqQueue Q){    return (Q.rear - Q.front +MAXSIZE)%MAXSIZE;}Status EnQueue(SqQueue &Q,QElemType e){    if((Q.rear +1)%MAXSIZE==Q.front )        return ERROR;    Q.base[Q.rear +1] = e;    Q.rear = (Q.rear + 1)%MAXSIZE;    return OK;}Status DeQueue(SqQueue &Q,QElemType &e){    if(Q.front == Q.rear )        return ERROR;    e = Q.base[Q.front];    Q.front = (Q.front + 1)%MAXSIZE;    return OK;}void PrintQueue(SqQueue S){    SqQueue Q = S;    while((Q.front+1)%MAXSIZE != Q.rear)    {        printf("%d ",Q.base[Q.front]);        Q.front = (Q.front + 1)%MAXSIZE;    }    printf("\n");    return ;}int main(){    SqQueue Q;    QElemType e;    InitQueue(Q);    printf("队列的长度为:%d\n",QueueLength(Q));    printf("请输入插入元素的值e:\n");    scanf("%d",&e);    EnQueue(Q, e);    printf("插入元素以后的队列值为:\n");    PrintQueue(Q);    DeQueue(Q,e);    printf("删除队头元素后的队列值为:\n");    PrintQueue(Q);    return 0;}

原创粉丝点击