您的位置:首页 > 其它

队列的相关操作

2012-05-23 22:49 169 查看
//2012年5月19日21:56:28

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

typedef struct qnode

{

int data;

struct qnode * next;

}qnode,*queueptr; // 定义链队列的每个节点的数据结构

typedef struct linkqueue

{

queueptr front;

queueptr rear;

}linkqueue;

void initqueue(linkqueue *); //初始化队列

void dequeue(linkqueue *,int *); //删除队头元素 并返回删除的值

void enqueue(linkqueue *,int *); //在对尾插入元素

bool is_empty(linkqueue); //判断队列是否为空

void clearqueue(linkqueue *); // 清空队列

bool destroyqueue(linkqueue *); //销毁队列

int lenthqueue(linkqueue); // 队列长度

void traverse(linkqueue); //遍历队列

void main(void)

{

linkqueue q;

int i;

int val; //插入和删除的元素

while(1)

{ printf("初始化队列输入 1 \n");

printf("插入元素输入 2 \n");

printf("删除元素输入 3 \n");

printf("求队列长度输入 4 \n");

printf("遍历队列输入 5 \n");

scanf("%d",&i);

if(1==i)

{

initqueue(&q);

}

else if(2==i)

{

printf("输入要插入元素的值 \n");

scanf("%d",&val);

enqueue(&q,&val);

}

else if(3==i)

{

dequeue(&q,&val);

printf("删除的元素为 %d\n",val);

}

else if(4==i)

{

val=lenthqueue(q);

printf("当前队列长度为 %d \n",val);

}

else if(5==i)

{ printf("当前队列元素为 \n");

traverse(q);

printf("\n\n");

}

else

{

printf("输入有误 请重新输入 \n");

}

}

/* int val=10;

initqueue(&q);

enqueue(&q,&val);

traverse(q);

dequeue(&q,&val); */

}

void initqueue(linkqueue * q) //初始化队列

{

q->front=q->rear=(queueptr)malloc(sizeof(qnode));

if(NULL==q->front)

{

printf("初始化失败\n\n");

exit(-1);

}

q->front->next=NULL;

}

void enqueue(linkqueue * q,int * val) //在对尾插入元素

{

queueptr newptr=(queueptr)malloc(sizeof(qnode));

if(NULL==newptr)

{

printf("加入失败\n");

exit(-1);

}

newptr->data=*val;

newptr->next=NULL;

q->rear->next=newptr;

q->rear=newptr;

}

void dequeue(linkqueue * q,int * val) //删除队头元素 并返回删除的值

{ queueptr p;

if(q->front==q->rear)

{

printf("队列为空");

exit(-1);

}

p=q->front->next;

*val=p->data;

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

if(q->rear==p)

q->front=q->rear; //如果队列中删除元素后为空则要进行初始化的处理

printf("删除的元素为 %d \n",*val);

free(p);

}

void traverse(linkqueue q) //遍历队列 从队尾开始遍历

{

if(is_empty(q))

{

printf("对列为空 \n");

exit(-1);

}

while(q.front->next!=NULL)

{

printf("%d ",q.front->next->data);

q.front=q.front->next;

}

//printf("\n\n");

}

bool is_empty(linkqueue q) //判断队列是否为空

{

if(q.rear==q.front)

{

return true;

}

else

return false;

}

void clearqueue(linkqueue * q) // 清空队列

{

q->front=q->rear;

}

bool destroyqueue(linkqueue * q) //销毁队列

{ queueptr p;

while(q->front!=q->rear)

{

p=q->front->next;

free(p);

p=q->front->next;

}

free(q->front);

free(q);

printf("队列已经销毁\n\n");

return true;

}

int lenthqueue(linkqueue q) // 队列长度

{

int i=0;

if(q.front==q.rear)

return 0;

while(q.front!=q.rear)

{

q.front=q.front->next;

i++;

}

return i;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: