C语言实现链队列的基本操作
2016-09-12 09:27
399 查看
//头文件内容
*************************************************链队列.h*******************************************************
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
int yes=0;
typedef struct node
{
char data;
struct node *next;
}node,*queueptr;
typedef struct
{
queueptr front;
queueptr rear;
}linkqueue;
**********************************************链队列.c***********************************************************
#include<stdio.h>
#include<stdlib.h>
#include"链队列.h"
void initqueue(linkqueue *q) //初始化操作,建立一个空队列
{
q->front=q->rear=(queueptr)malloc(sizeof(node));
if(!(q->front))
exit(1);
q->front->next=0;
}
void enqueue(linkqueue *q,char e) //插入新元素e到队列中并成为队尾元素
{
queueptr p;
p=(queueptr)malloc(sizeof(node));
if(!p)exit(1);
p->data=e;
p->next=0;
q->rear->next=p;
q->rear=p;
}
void creatqueue(linkqueue *q) //创建一个长度由自己决定的队列并初始化
{
int i,length;
int num;
queueptr p;
printf("请输入队列长度:\n");
scanf("%d",&length);
printf("请输入队列的元素:\n");
for(i=0;i<length;i++)
{
p=(queueptr)malloc(sizeof(node));
if(!p)exit(1);
scanf("%d",&num);
p->data=num;
p->next=0;
q->rear->next=p;
q->rear=p;
}
yes=1;
}
void destroyqueue(linkqueue *q) //若队列存在,则销毁它
{
if(!q)
{
printf("链队列已经是空队列!\n");
exit(1);
}
while(q->front)
{
q->rear=q->front->next;
free((q->front));
q->front=q->rear;
if(!q->rear)
free(q->rear);
}
free(q->front);
}
void disqueue(linkqueue *q) //输出队列元素
{
node *r=q->front->next;
printf("此时的链队列输出:\n");
while(r)
{
printf("%d ",r->data);
r=r->next;
}
printf("\n");
}
void lenqueue(linkqueue *q) //求队列长度
{
node *r=q->front->next;
int s=0;
printf("此时的链队列长度为:\n");
while(r)
{
r=r->next;
s++;
}
printf("%d\n",s);
}
char dequeue(linkqueue *q,int e) //删除队列中队头元素,并用e返回其值
{
node *p;
if(q->front==q->rear)
return -1;
p=q->front->next;
e=p->data;
q->front->next=p->next;
if(q->rear=
4000
=p)
q->rear=q->front;
free(p);
return e;
}
int queueempty(linkqueue *q) // 判断队列是否为空
{
if(q->front==q->rear)
return 1;
else
return 0;
}
void menu() //菜单
{
printf(" 链队列试验统一界面 \n");
printf("********************************************\n");
printf("1 建立链队列! *\n");
printf("2 链队列入队操作! *\n");
printf("3 链队列出队操作! *\n");
printf("4 求链队列长度! *\n");
printf("5 判断链队列是否为空! *\n");
printf("6 输出链队列! *\n");
printf("7 销毁链队列! *\n");
printf("0 退出! *\n");
printf("********************************************\n");
}
*************************************************************Test.c***************************************************
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include"链队列.c"
int main(void)
{
linkqueue ptr;
int sel;
int num;
initqueue(&ptr);
while(1)
{
menu();
printf("please input command:\n");
scanf("%d",&sel);
switch(sel)
{
case 1:if(yes==1)
{
printf("此时表已创建!不能再次创建!\n");
break;
}
else
creatqueue(&ptr);break;
case 2:if(yes==0)
{
printf("此时表未创建!不能入队!\n");
break;
}
else
{
printf("请输入队的元素值:");
scanf("%d",&num);
enqueue(&ptr,num);
break;
}
case 3:if(yes==0)
{
printf("此时表为创建!不能出队!\n");
break;
}
else
{
num=dequeue(&ptr,num);
printf("目前出队的元素是%d",num);
break;
}
case 4:if(yes==0)
{
printf("此时链队列未创建!不能求其长度!\n");
break;
}
lenqueue(&ptr);
break;
case 5:if(yes==0)
{
printf("此时表未创建!不能判断是否为空!\n");
break;
}
else
{
if(queueempty(&ptr))
printf("此时队列为空队列!\n");
else
printf("此时队列为非空队列!\n");
break;
}
case 6:if(yes==0)
{
printf("此时链队列未创建!不能输出!\n");
break;
}
disqueue(&ptr);
break;
case 7:if(yes==0)
{
printf("此时链队列未创建!不能销毁!\n");
break;
}
destroyqueue(&ptr);
printf("销毁成功\n");
break;
case 0:exit(1);break;
default:printf("输入命令错误!请重新输入:\n");
break;
}
}
return OK;
}
*************************************************链队列.h*******************************************************
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
int yes=0;
typedef struct node
{
char data;
struct node *next;
}node,*queueptr;
typedef struct
{
queueptr front;
queueptr rear;
}linkqueue;
**********************************************链队列.c***********************************************************
#include<stdio.h>
#include<stdlib.h>
#include"链队列.h"
void initqueue(linkqueue *q) //初始化操作,建立一个空队列
{
q->front=q->rear=(queueptr)malloc(sizeof(node));
if(!(q->front))
exit(1);
q->front->next=0;
}
void enqueue(linkqueue *q,char e) //插入新元素e到队列中并成为队尾元素
{
queueptr p;
p=(queueptr)malloc(sizeof(node));
if(!p)exit(1);
p->data=e;
p->next=0;
q->rear->next=p;
q->rear=p;
}
void creatqueue(linkqueue *q) //创建一个长度由自己决定的队列并初始化
{
int i,length;
int num;
queueptr p;
printf("请输入队列长度:\n");
scanf("%d",&length);
printf("请输入队列的元素:\n");
for(i=0;i<length;i++)
{
p=(queueptr)malloc(sizeof(node));
if(!p)exit(1);
scanf("%d",&num);
p->data=num;
p->next=0;
q->rear->next=p;
q->rear=p;
}
yes=1;
}
void destroyqueue(linkqueue *q) //若队列存在,则销毁它
{
if(!q)
{
printf("链队列已经是空队列!\n");
exit(1);
}
while(q->front)
{
q->rear=q->front->next;
free((q->front));
q->front=q->rear;
if(!q->rear)
free(q->rear);
}
free(q->front);
}
void disqueue(linkqueue *q) //输出队列元素
{
node *r=q->front->next;
printf("此时的链队列输出:\n");
while(r)
{
printf("%d ",r->data);
r=r->next;
}
printf("\n");
}
void lenqueue(linkqueue *q) //求队列长度
{
node *r=q->front->next;
int s=0;
printf("此时的链队列长度为:\n");
while(r)
{
r=r->next;
s++;
}
printf("%d\n",s);
}
char dequeue(linkqueue *q,int e) //删除队列中队头元素,并用e返回其值
{
node *p;
if(q->front==q->rear)
return -1;
p=q->front->next;
e=p->data;
q->front->next=p->next;
if(q->rear=
4000
=p)
q->rear=q->front;
free(p);
return e;
}
int queueempty(linkqueue *q) // 判断队列是否为空
{
if(q->front==q->rear)
return 1;
else
return 0;
}
void menu() //菜单
{
printf(" 链队列试验统一界面 \n");
printf("********************************************\n");
printf("1 建立链队列! *\n");
printf("2 链队列入队操作! *\n");
printf("3 链队列出队操作! *\n");
printf("4 求链队列长度! *\n");
printf("5 判断链队列是否为空! *\n");
printf("6 输出链队列! *\n");
printf("7 销毁链队列! *\n");
printf("0 退出! *\n");
printf("********************************************\n");
}
*************************************************************Test.c***************************************************
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include"链队列.c"
int main(void)
{
linkqueue ptr;
int sel;
int num;
initqueue(&ptr);
while(1)
{
menu();
printf("please input command:\n");
scanf("%d",&sel);
switch(sel)
{
case 1:if(yes==1)
{
printf("此时表已创建!不能再次创建!\n");
break;
}
else
creatqueue(&ptr);break;
case 2:if(yes==0)
{
printf("此时表未创建!不能入队!\n");
break;
}
else
{
printf("请输入队的元素值:");
scanf("%d",&num);
enqueue(&ptr,num);
break;
}
case 3:if(yes==0)
{
printf("此时表为创建!不能出队!\n");
break;
}
else
{
num=dequeue(&ptr,num);
printf("目前出队的元素是%d",num);
break;
}
case 4:if(yes==0)
{
printf("此时链队列未创建!不能求其长度!\n");
break;
}
lenqueue(&ptr);
break;
case 5:if(yes==0)
{
printf("此时表未创建!不能判断是否为空!\n");
break;
}
else
{
if(queueempty(&ptr))
printf("此时队列为空队列!\n");
else
printf("此时队列为非空队列!\n");
break;
}
case 6:if(yes==0)
{
printf("此时链队列未创建!不能输出!\n");
break;
}
disqueue(&ptr);
break;
case 7:if(yes==0)
{
printf("此时链队列未创建!不能销毁!\n");
break;
}
destroyqueue(&ptr);
printf("销毁成功\n");
break;
case 0:exit(1);break;
default:printf("输入命令错误!请重新输入:\n");
break;
}
}
return OK;
}
相关文章推荐
- C语言实现单链队列的基本操作(五)
- C语言实现循环队列基本操作(初始化、判断队空、入队、出队)
- 算法与数据结构-队列的基本操作C语言实现
- 顺序队列(循环队列)基本操作实现 C语言
- C语言链表实现队列操作
- 静态串及其基本操作(C语言实现)
- (C语言版)栈和队列(一)——实现链式栈和链式队列的基本操作以及遇到的问题
- 顺序存储结构线性表基本操作 纯C语言实现
- C++队列实现的基本操作
- C语言数组实现栈的基本操作,并利用O(1)求出栈中最小元素
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 八.二叉树各种操作的C语言实现 树的一些基本的操作,包括,树的建立,树的深度,
- 数据结构C语言实现—队列操作
- c++ 队列基本操作实现
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 二叉树遍历非递归算法所用到的栈以及层次遍历所用到的队列的基本操作算法的实现
- 【队列】链式结构实现队列的基本操作
- 队列基本操作的实现
- 试用多态实现线性表(队列,串,堆栈),要求具备线性表的基本操作:插入,删除,测长等。
- bo3-4.c 用单链表的基本操作实现链队列(存储结构由c3-2.h定义)的基本操作(9个)