队列的基本操作(数据结构C语言版)

 队列的基本操作我使用的是链式结构的方式来实现

关于队列:

1.队列的特性特点:队列是一种“先进先出”缩写为FIFO的线性表。它只允许在表的一端进行插入,而在另一端“删除”元素。

2.队列的两端分别叫做:队头、队尾。队尾:允许插入数据的一端。队头:允许“删除”数据的一端。

链队列:

1.在链队列中 它的队头就是头结点(表头),而队尾无需固定(插入时确定)。

2.链队列创建之初需要确定两个结构,一个是结点结构、一个是链队结构。

结点结构:                                                          

typedef struct QN{                                                  
    ElemType data;
    struct QN *next;
}QN, *QP;

链队结构:

typedef struct{
    QP front;
    QP rear;
}LinkQ;

3.链队列的几个基本操作:(前提是要先构造一个空队列)

  • 清空队列

实现队列的清空首先肯定会想到这样写“Q.front = Q.rear;  ” 让头等于尾 ,这其实也算是清空,但是这样并没有实现真正意义上的清空它会不断的向内存申请空间造成严重的空间浪费。具体怎样实现清空的看参考下面的代码。

 队列数据的输出的关键在于怎样对队列进行遍历输出。由于我使用的是链队列的方式来实现队列的所以可以把它看成是单链表,用单链表的遍历输出模式来进行  放法是:定义一个指针 p 来先指向队列头的next域,然后以“p != NULL”为循环条件来进行遍历输出,当然也不能忘掉空队列的情况,所以用到一个人变量 i 来进行判断。

在入队列时要先考虑一下队列的特性 思考一下用哪种方式来进行入队列比较合适(头插法/尾插法),队列是“先进先出”的如果采用头插法的话不仅遍历起来会很麻烦在查找数据的时候也会很麻烦,所以采用尾插法来进行。 在这里我要特别提醒一下一旦入队列成功一个,那么你的尾指针的指向就要顺移一个“Q.rear = p;”。

定义一个指针p来进行遍历输出

 由于队列存在“先进先出”的特点,如若采用头插法来实现入队列就会显得很困难所以采用尾插法来实现

 在数据出队列时按照老规矩先判断是否为空队列,若非空那么p指针指向头,将p指针指向的数据赋给要出队列的 e,

当p指针指向最后一个(即 尾rear)时 就将队列置为空。

  • 队列数据输出
  • 数据入队列
  • 数据出队列
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//结点结构
typedef struct QN{
	ElemType data;
	struct QN *next;
}QN, *QP;
//链队列结构
typedef struct{
	QP front;
	QP rear;
}LinkQ;

void menu()
{
	printf("*************************队列基本操作************************\n");
	printf("\t\t\t1  队列清空\n");
	printf("\t\t\t2  队列数据输出\n");
	printf("\t\t\t3  数据入队列\n");
	printf("\t\t\t4  数据出队列\n");
	printf("\t\t\t0  退出系统\n");
	printf("*************************队列基本操作************************\n\n\n");
}
//构造一个空队列
Status InitQ(LinkQ &Q)
{
	Q.front=Q.rear=(QP) malloc (sizeof(QN)); //分配空间
	if(!Q.front) 
		exit(ERROR);
	Q.front->next=NULL; //头的next指针域为空NULL,表示空队列
	return OK;
}
//清空队列
Status ClearQ(LinkQ &Q)
{
	QP p,q;  //定义;两个指针来指向头(然后依次向后直至尾部)
	p = Q.front;
	while(p)  // 当p指针指向不为空时  从头开始 指一个清空一个
	{	
		q = p;
		p = p->next; 
		free(q);  
	}
	Q.front->next = NULL; //最后将链队列的头front的next域置为空
	Q.front = Q.rear;  //最后将尾rear 置回来等于 front 重新回到空队列
	return OK;
}
//输出队列数据
void PopQ(LinkQ Q)
{
	QP p;  //定义一个结点结构类型的指针 p
	int i = 0;
	p = Q.front->next; //让p指针先指向头的next域
	while (p!=NULL) 
	{
		i++;
		printf("%d\n",p->data);
		p = p->next; //让指针p指向下一个
	}
	if (i == 0)
		printf("空队列! 没有数据!\n");
}
//入队列
Status EnterQ(LinkQ &Q,ElemType e)
{
	QP p; //定义一个结点结构类型的指针 p
	p = (QP)malloc(sizeof (QN)); //给他分配一个空间
	if (!p) exit(ERROR);
	p->data = e;  //p的data域用来存放要如队列的数据
	p->next = NULL;
	Q.rear->next = p; //采用尾插法
	Q.rear = p; //入队列一个,尾指针就移动一个
	return OK;
}
//出队列
Status DeleQ(LinkQ &Q,ElemType &e)
{
	QP p;
	if (Q.rear == Q.front)
		return ERROR; //如果是空队列就返回ERROR
	p = Q.front->next; //p指针指向头
	e = p->data; //将p指针指向的数据赋给要出队列的 e  
	Q.front->next = p->next; //"尾进头出"
	if (Q.rear == p) 
		Q.rear = Q.front; //当p指针指向最后一个(即 尾rear)时 就将队列置为空
	free(p); //释放队列空间
	return OK;
}

void main()
{
	LinkQ Q;
	int choose;
	ElemType e=0;
	InitQ(Q);
	while(1)
	{
		menu();
		printf("Please choose:");
		scanf("%d",&choose);
		switch(choose)
		{
			case 1:
				if(ClearQ(Q) == OK)
					printf("清空成功!\n");
				else
					printf("清空失败!\n");
				getchar(); getchar();
				system("cls");
				break;
			case 2:
				PopQ(Q);
				getchar(); getchar();
				system("cls");
				break;
			case 3:
				printf("请输入数据:");
				scanf("%d",&e);
				if(EnterQ(Q,e) == OK)
					printf("入队成功!\n");
				else
					printf("入队失败!\n");
				getchar(); getchar();
				system("cls");
				break;
			case 4:
				printf("出队数据为:\n");
				if(DeleQ(Q,e) == OK)
					printf("%d\n",e);
				else
					printf("队空不能出队!\n");
				getchar(); getchar();
				system("cls");
				break;
			case 0:
				printf("欢迎下次使用,再见!\n");
				exit(0);
				break;
			default:
				printf("输入功能选项错误  请输入选项0~4!\n"); 
				getchar(); getchar();
				system("cls");
		
		}
	}
}

 

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,数据结构是计算机科学中一种非常重要的学科,在程序设计中占有重要地位。其目的是为了设计、实现和应用数据结构和算法。 在学习数据结构时,C语言是一种非常重要的编程语言。数据结构C语言专升本习题,涵盖了数据结构中基本的数据类型、简单的数据结构和算法基础等内容。 学习数据结构C语言专升本习题,需要掌握C语言中的基础知识,如数组、指针、结构体等。这些知识对于理解数据结构和算法的原理和实现方式非常重要。 此外,在学习数据结构C语言专升本习题时,还需要注意掌握常见的数据结构,如栈、队列、链表和树等。同时还需要学习和掌握算法分析的基本方法和技巧。 最后,在学习数据结构C语言专升本习题时,需要多动手实践,通过编写程序来加深对数据结构和算法的理解和掌握。只有通过不断地实践和练习,才能真正学好数据结构和算法,并提高自己的编程能力。 ### 回答2: 数据结构是计算机科学的基础课程之一。它主要研究不同数据的组织、存储和管理方法,以及对这些数据进行操作的算法和技术。 C语言是一种通用的、高级的编程语言,与数据结构紧密相关。在数据结构c语言专升本习题中,学习者需要掌握基本的数据结构和算法,并利用C语言来实现和优化它们。 习题通常包括对不同的数据结构(如数组、链表、树等)进行操作的编程题目,以及针对常见算法(如排序算法、查找算法等)的实现练习。通过做这些习题,学习者可以加深对数据结构和算法的理解,并提高编程技能。 在解决习题时,学习者需要注意算法的效率和空间复杂度,避免出现时间和空间浪费的情况。同时,要注意代码的风格和规范,编写高质量、易读、易维护的代码。 总之,数据结构c语言专升本习题对于提高计算机科学专业的技能和能力非常重要。学习者应该认真掌握这些习题,并理解其中的原理和思想,以便在以后的实际工作中得心应手。 ### 回答3: 数据结构是计算机科学中一个非常重要的领域,它主要研究数据组织、存储和管理的方法,是计算机软件设计必不可少的基础。 C语言是一种广泛使用的高级编程语言,出色的性能和灵活的特性使它成为许多软件开发人员和系统程序员的首选语言。 对于专升本考试来说,掌握数据结构C语言是非常必要的。数据结构c语言习题可以帮助我们深入理解数据结构C语言的使用。 在数据结构c语言习题中,我们可以学习到常见的数据结构,例如线性结构、树结构和图结构等等。同时,还可以学习到如何用C语言实现这些数据结构操作和算法。 通过解决数据结构c语言习题,我们可以提高自己的编程能力,为日后的软件开发和系统设计积累宝贵经验。同时,还可以为我们的专升本考试打下坚实的基础,提高自己的考试成绩。 总之,数据结构c语言习题对于我们的学习和职业发展都非常重要,希望大家能够认真对待这一领域,不断提升自己的编程技巧和算法思维。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值