队列的链式存储 在遍历的时候自己写的代码调试老是出现崩塌状态,参考了网上的一些代码 修改了一下 同时注释掉了自己写的代码 作为对错误的一些保存和反思吧 没有完全删掉,经调试此代码无误“- -”话不多说 上代码
#include<stdio.h>
#include<stdlib.h> //导入malloc函数
//对链队列进行一个结构体定义
//对节点先进行一个结构体定义
typedef int ElemType;
typedef struct node{
int data; //定义一个数据域
struct node *next; //定义一个指针域
}node;
//接下来对链队进行结构体定义
typedef struct {
node *front; //定义一个头指针
node *rear; //定义一个尾指针
}linkqueue;
//链队常用的一些操作
//初始化
void initqueue(linkqueue *&qu){
qu=(linkqueue*)malloc(sizeof(linkqueue));
qu->front=NULL;//链队的初始状态 头指针和尾指针都为空
qu->rear=NULL;
}
//判断是否队列空
int isempty(linkqueue *qu){
if(qu->rear==NULL||qu->front==NULL)
return 1; //用1返回队空情况
else
return 0; //用0返回队列不空情况
}
//入队操作
void enqueue(linkqueue *&qu,ElemType e){
node *p;//构造一个节点 并开辟一块空间
p=(node*)malloc(sizeof(node));
//p为待插入的节点
p->data=e;
p->next=NULL;
//如果队列为空 则新节点既是队首节点,也是队尾节点
if(qu->rear==NULL)
qu->front=qu->rear=p;
else
{
//队列 先进先出 所以 把p链接到尾节点后面 并尾指针重新指向
qu->rear->next=p;
//p为新的rear指针所指向的位置
qu->rear=p;
}
}
//出队操作
int dequeue(linkqueue *&qu,ElemType &e){
node *p;
//若队列空 则无法出队
if(qu->rear==NULL)
return 0;
else
p=qu->front;
//若队列中只有一个元素 则出队的时候需要做特殊处理
//头指针和尾指针指向同一位置 说明队列中只有一个元素
if(qu->front==qu->rear){
qu->rear=qu->front=NULL;
}
else
qu->front=qu->front->next;
e=p->data;
printf("%d",e);
free(p);
return 1; //返回出队的元素
}
/*印队列中的元素//此段代码有问题 虽然我很不想承认自己写的东西错了 但是事实就是酱紫
void printfs(linkqueue *qu)
{
node *q;
q=qu->front;
if(isempty(qu)==1)
printf("空!\n")
while(q != NULL){
q=q->next;
printf("%d ",q->data);
}
}*/
//遍历队列
void printfs(linkqueue *qu)
{
//如果队列为空
if(isempty(qu)==1)
printf("空!\n");
node *temp = qu->front;
while(temp != NULL){
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
//主函数
int main(){
linkqueue *qu; //定义一个链队列
ElemType e; //入队的数据元素
int choose;
printf("1.初始化队列\n");
printf("2.判断队列是否为空\n");
printf("3.入队操作\n");
printf("4.出队操作\n");
printf("5.打印队列中元素\n");
for(;;){
printf("请输入您的操作\n");
scanf("%d",&choose);
switch(choose){
case 1:
initqueue(qu); //对队列进行初始化
break;
case 2:
if(isempty(qu)==1)
printf("队列空\n");
else
printf("队列中存在元素\n");
break;
case 3: //入队列操作
printf("请输入您需要入队列的元素\n");
scanf("%d",&e);
enqueue(qu,e);
break;
case 4: //出队列操作
if(dequeue(qu,e)==0){
printf("出队列失败\n");
break;
}
else
printf("出队列,成功!\n");
printf("队列中的剩余元素为");
printfs(qu);
break;
case 5: //打印队列元素
printfs(qu);
break;
}
}
}