链队列的c语言实现
2015-06-11 22:10
330 查看
#include<stdio.h>
#include<stdlib.h>
#define QUEUE_MAX_SIZE 100
typedef int Status;
typedef int QElemtype;
typedef struct QNode{
QElemtype data;
struct QNode *next;
}*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) return 0;
Q.front->next=NULL;
return 1;
}
Status DestoryQueue(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return 1;
}
Status ClearQueue(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
Q.front->data=NULL;
Q.front=Q.rear;
}
return 1;
}
Status IsQueueEmpty(LinkQueue &Q){
if(Q.front==Q.rear)return 1;
return 0;
}
Status QueueLength(LinkQueue &Q){
QNode *p;
int i=0;
p=Q.front;
while(p->next){
p=p->next;
i++;
}
return i;
}
Status GetHead(LinkQueue &Q,QElemtype &e){
if(Q.front==Q.rear) return 0;
e=Q.front->next->data;
return 1;
}
Status EnQueue(LinkQueue &Q,QElemtype e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) return 0;
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
Status DeQueue(LinkQueue &Q,QElemtype &e){
QueuePtr p;
p=Q.front->next;
if(Q.front==Q.rear) return 0;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return 1;
}
Status PrintQueue(LinkQueue &Q){
QNode *p;
p=Q.front;
while(p->next){
p=p->next;
printf("%d\n",p->data);
}
return 1;
}
int main(){
LinkQueue q;
InitQueue(q);
int set,isclose;
QElemtype e;
while(1){
set=0;
printf(" 1.队尾插入元素\n 2.删除队头元素并输出\n 3.输出队列的长度\n 4.销毁队列\n 5.得到队头元素 \n 6.查询该队列是否为空 \n 7.输出整个队列中的所有元素\n 8.建立队列(在销毁后重建)\n");
scanf("%d",&set);
switch(set){
case 1:printf("请输入元素\n");scanf("%d",&e);if(EnQueue(q,e)) printf("插入成功\n");else printf("插入失败\n"); break;
case 2:if(DeQueue(q,e))printf("%d\n",e);else printf("队列里无元素\n");break;
case 3:printf("%d\n",QueueLength(q));break;
case 4:if(DestoryQueue(q)) printf("销毁成功\n");break;
case 5:if(GetHead(q,e)) printf("%d\n",e);break;
case 6:if(IsQueueEmpty(q)) printf("队列为空\n"); else printf("队列不为空\n");break;
case 7:PrintQueue(q);break;
case 8:if(InitQueue(q));printf("建立成功\n");break;
}
printf("结束输入0\n");
scanf("%d",&isclose);
if(!isclose) break;
}
return 0;
}
本文出自 “zjwzjw369” 博客,谢绝转载!
#include<stdlib.h>
#define QUEUE_MAX_SIZE 100
typedef int Status;
typedef int QElemtype;
typedef struct QNode{
QElemtype data;
struct QNode *next;
}*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q){
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) return 0;
Q.front->next=NULL;
return 1;
}
Status DestoryQueue(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return 1;
}
Status ClearQueue(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
Q.front->data=NULL;
Q.front=Q.rear;
}
return 1;
}
Status IsQueueEmpty(LinkQueue &Q){
if(Q.front==Q.rear)return 1;
return 0;
}
Status QueueLength(LinkQueue &Q){
QNode *p;
int i=0;
p=Q.front;
while(p->next){
p=p->next;
i++;
}
return i;
}
Status GetHead(LinkQueue &Q,QElemtype &e){
if(Q.front==Q.rear) return 0;
e=Q.front->next->data;
return 1;
}
Status EnQueue(LinkQueue &Q,QElemtype e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) return 0;
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
Status DeQueue(LinkQueue &Q,QElemtype &e){
QueuePtr p;
p=Q.front->next;
if(Q.front==Q.rear) return 0;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return 1;
}
Status PrintQueue(LinkQueue &Q){
QNode *p;
p=Q.front;
while(p->next){
p=p->next;
printf("%d\n",p->data);
}
return 1;
}
int main(){
LinkQueue q;
InitQueue(q);
int set,isclose;
QElemtype e;
while(1){
set=0;
printf(" 1.队尾插入元素\n 2.删除队头元素并输出\n 3.输出队列的长度\n 4.销毁队列\n 5.得到队头元素 \n 6.查询该队列是否为空 \n 7.输出整个队列中的所有元素\n 8.建立队列(在销毁后重建)\n");
scanf("%d",&set);
switch(set){
case 1:printf("请输入元素\n");scanf("%d",&e);if(EnQueue(q,e)) printf("插入成功\n");else printf("插入失败\n"); break;
case 2:if(DeQueue(q,e))printf("%d\n",e);else printf("队列里无元素\n");break;
case 3:printf("%d\n",QueueLength(q));break;
case 4:if(DestoryQueue(q)) printf("销毁成功\n");break;
case 5:if(GetHead(q,e)) printf("%d\n",e);break;
case 6:if(IsQueueEmpty(q)) printf("队列为空\n"); else printf("队列不为空\n");break;
case 7:PrintQueue(q);break;
case 8:if(InitQueue(q));printf("建立成功\n");break;
}
printf("结束输入0\n");
scanf("%d",&isclose);
if(!isclose) break;
}
return 0;
}
本文出自 “zjwzjw369” 博客,谢绝转载!
相关文章推荐
- 笔记:《C++ Primer》第1章和第2章
- C语言中可打印字符
- C语言的内存区域(虚拟地址)探索
- LeetCode 之 Contains Duplicate I II III — C++ 实现
- C++ STL中map存储方式——SAP电面(4)
- 一步步将vim改造成C/C++开发环境(IDE)
- C++ int与string的转化
- C++中堆和栈内存分配
- chapter12test1
- C++ 读写文件流
- 聊聊C++临时对象的析构时间点------顺便再次提醒大家谨慎使用string的c_str方法
- LeetCode 之 Rotate Array — C++ 实现
- c++之进制转换16进制-10进制
- C++利用反射和简单工厂模式实现业务模块解耦
- C语言如何调用 memcpy 函数 实现内存拷贝
- LeetCode 之 Min Stack — C++ 实现
- 二进制值和十六进制字符串相互转换的C++代码
- 迷宫问题——堆栈应用(C++版)
- 给四条线段,判断是否是矩形
- 类作用域中名字查找的思考(《C++ primer》第四版P382)