数据结构-链队列

这篇博客介绍了链队列的基本操作,包括初始化、入队和出队。通过C语言实现了一个链队列的数据结构,并提供了相应的函数实现。代码中展示了如何动态分配内存创建队列节点,以及如何进行元素的入队和出队。在主函数中,用户可以选择执行入队或出队操作,实现了简单的交互式队列操作示例。

链队列的创建,入队,出队操作

内容很简单,上代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#include<math.h>

typedef int QElemtype;

typedef struct QNode{
	QElemtype data;
	struct QNode *Next; 
}QNode,*QueuePtr;

typedef struct{
	QueuePtr flont;
	QueuePtr rear; 
}LinkQueue;

void InitQueue(LinkQueue &Q){
	Q.rear = (QueuePtr)malloc(sizeof(QNode));//队列头结点 
	if(!Q.rear) {
		printf("队列初始化失败!\n");
		return;
	}
	Q.flont = Q.rear; 
	Q.rear->Next = NULL;
	printf("队列初始化成功!\n");
}

void EnQueue(LinkQueue &Q,QElemtype e){
	QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
	if(!s) {
		printf("内存分配失败!\n");
		return;
	}
	s->data = e;
	s->Next = Q.rear->Next;
	Q.rear->Next  = s;
	Q.rear = s;
	printf("入队操作成功!\n");
}

void DeQueue(LinkQueue &Q,QElemtype &e){//用e来保存出队元素 
	if(Q.flont==Q.rear) {
		printf("队列为空,出队操作失败!\n");
		return;
	}
	QueuePtr p = Q.flont->Next; 
	e = p->data;
	Q.flont->Next = p->Next;
	if(p==Q.rear) Q.rear = Q.flont;
	free(p);
	printf("出队成功!\n");
	printf("出队元素为:%d\n",e);
}

int main(){
	LinkQueue Q;
	InitQueue(Q);
	printf("1 入队 ,2 出队 ,按其他结束\n");
	int c,e;
	while(1){
		printf("请输入接下来要进行的操作:\n");
		scanf("%d",&c);
		if(c==1) {
		  printf("请输入入队的元素:\n");
		  scanf("%d",&e);
		  	EnQueue(Q,e);
		}
		else if(c==2){
			DeQueue(Q,e);
			
		}
		else break;
	}
	
}

测试结果

 

 

### 关于队列出队操作的数据结构考题解答 对于队列而言,出队操作涉及移除并返回队首元素。具体来说,在执行此操作前需先判断队列是否为空;如果非空,则调整指针使得原头节点被释放,并更新新的头部指向。 在实际编程实现中,假设存在一个表示队列的类`LinkQueue`以及相应的成员函数用于处理入队(`EnQueue`)与出队(`DeQueue`)逻辑: ```cpp typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front,rear; // 队列的头和尾指针 }*LinkQueue; ``` 当调用`DeQueue`方法时,会按照如下方式工作[^1]: - 将该位置上的数据复制出来作为此次出队的结果; - 更新front指针至下一个有效节点处; - 如果此时front等于rear说明这是最后一个元素,那么还需要把rear也置为NULL以保持一致性; - 最终销毁不再使用的旧head节点内存空间。 下面给出完整的C++代码片段来展示如何定义这样的功能: ```cpp Status DeQueue(LinkQueue &Q,ElemType &e){ if(Q->front==Q->rear) return ERROR;// 判定队空 QueuePtr p=Q->front->next; e=p->data; free(Q->front); Q->front->next=p->next; if (p == Q->rear)// 当队列只有一个元素的时候特殊处理 Q->front = Q->rear = NULL; free(p); return OK; } ``` 上述过程确保了每次都能安全有效地从队列前端取出一项记录而不会破坏整体结构或造成资源泄漏等问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值