队列的链式表示

队列的链式存储 在遍历的时候自己写的代码调试老是出现崩塌状态,参考了网上的一些代码 修改了一下 同时注释掉了自己写的代码 作为对错误的一些保存和反思吧 没有完全删掉,经调试此代码无误“- -”话不多说 上代码

#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;    
    }    
}    
}  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A面dai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值