C-数据结构之队列(顺序和链式)

博客围绕队列这一数据结构展开,涉及相关算法知识。队列是重要的数据结构,在信息技术领域有广泛应用,了解其原理和相关算法,有助于提升编程和解决问题的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11.24 学习笔记-今日打卡队列(链式和顺序表)
代码没有注重格式,只是能够实现基本的功能。
代码中很多多余的变量和书写,都是在调试过程中产生的,(本博客只是记录代码)
//队列-链式存储 
#include<stdio.h>
#include<stdlib.h>
//建立一个结点的结构体,里面存有data和next 
typedef struct Qnode{
	int data;
	struct Qnode* next;
}node;
//链式队列的首尾指针 
typedef struct Queuenode{
	node* front;
	node* rear;
	int length;//记录链式队列的长度。 
}Queue;
//初始化队列 
Queue init(Queue p)
{
	p.front=p.rear=(node *)malloc(sizeof(node));//申请了一个头结点 
	if(p.front==NULL&&p.rear==NULL)
	{
		printf("初始化失败\n");
		exit(0); 
	}
	p.front->next=NULL;//头结点的next置为空,就相当于初始化了一个链队 
	return p;
}
//入队操作 --实际是尾插法的运用 
Queue insert(Queue p)
{
//	printf("p=%d",p);
	int data;
	node *q;
	if(q==NULL)
	{
		printf("无内存了\n");
		exit(0);
	}	
	while(1)
	{
	printf("请输入要入队的元素(输入9999表示结束)\n");
	scanf("%d",&data);
	if(data!=9999)
	{
	q=(node*)malloc(sizeof(node));//申请一个新的结点 
	q->next=p.rear->next;
	p.rear->next=q;
	q->data=data;
	p.rear=q;
	p.length++;
	}
	else
	{
		printf("入队结束\n");
		break;
	}
	}
	printf("\n当前队列中的%d个结点\n",p.length);
	return p;
}
int empty(Queue p)
{
	if(p.front==p.rear)
	{
		return 0;
	}
	else{
		return 1;
	}
}
//从队头取出元素,p.front++ 
Queue del(Queue p)
{
	node *del;//保存删除的结点 
	if(empty(p)==0)
	{
		printf("队列为空,无法出队列\n");
		return p;
	}
	else{
		if(p.front->next==p.rear)
		{//只有一个结点 
			printf("\n出队的结点为%d-",p.rear->data);
			free(p.rear);
			p.rear=p.front;
			p.front->next=NULL;
			p.length--;
		}
		else{
			del=p.front->next;
			printf("\n出队的结点为%d-\n",del->data);
			p.front->next=p.front->next->next;
			free(del);
			p.length--; 
		}		
	}
	printf("当前的队列长度为%d\n",p.length);
	return p;
 } 
 void pri(Queue p)
 {
 	if(empty(p)==0)
 	{
 		printf("队列为空,无法打印\n");
	 }
	 else{
	 //	printf("%d",p);
	 	p.front=p.front->next;//从第一个队列元素开始 
	 	while(p.front!=NULL)
	 	{
	 		printf("%d->",p.front->data);
	 		p.front=p.front->next; 
		 }
	 }
 }
 int main()
 {
 	Queue q,L;
 	q.front=q.rear=NULL;
 	q.length=0;
 //	printf("q=%d",q);
 	q=init(q);
 //	printf("q=%d",q);
 	q=insert(q);
 //	printf("q=%d",q);
 	pri(q);
 	del(q);
 	pri(q);
 	return 0;
 }
 
 
//顺序表--实现队列-队尾插入元素,队头删除元素 
//代码中存在很多多余的东西和变量,都是自己在调试过程中设置的,上传博客只是想记录代码。
 #include<stdio.h>
 #define MAXSIZE 100
 //创建一个线性队列 
 typedef struct{
 	int data[MAXSIZE];
 	int rear,front;
 }seq;
seq creat()
 {
 	seq s;
 	int e;
	s.rear=s.front=0;//初始化一个队列 
	//插入元素的时候,队头指针不动,队尾加一
	//其实实质就是rear和front在控制长度而已 
	while(1)
	{
	printf("请输入您想要入队的元素(输入9999结束):\n") ;
	scanf("%d",&e);
	if(e!=9999)
	{
		s.data[s.rear]=e;
		s.rear++;
	}
	else
	{
		break;
	}
		
  } 
  return s;
}

void pri(seq s)
{
	printf("当前队列中的元素为:\n");
	while(s.data[s.front]!=NULL)
	{
		printf("%d",s.data[s.front]);
		s.front++;
	}
}
//入队操作 
seq insert(seq s)
{
	int e;
	printf("请输入想要入队的元素:\n");
	scanf("%d",&e);
	printf("\n队尾在%d",s.rear);
	//先判断队是否已经满
	if(s.rear!=MAXSIZE-1)
	{
		s.data[s.rear]=e;
		printf("插入之后:%d",s.data[s.rear]);
	} 
	else
	{
		printf("队列已经满了,不能在入队了\n");
	}
	return s;
}
//队列--出队操作,只能先从队头出来。 
seq del(seq s)
{
	int x,m;//用x保存出队的元素 
//在队头进行删除,首先需要判断队列是否为空
	while(1)
   {
	printf("要从队头出元素吗(9999)\n");
	scanf("%d",&m);
	if(m==9999)
	{	x=s.data[s.front]; 
		s.data[s.front]=0;
		s.front++;	
		printf("出队元素为:%d",x);
		if(x==0)
		{
			printf("出队完毕\n");
			break;
		}
	}
	else
	{
		break;
	}
}
	 return s;
}
int main(){
	seq L,q,s;
	L=creat();
	pri(L);
	q=insert(L);
	pri(q);
	s=del(q);
	pri(s);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杜杜_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值