数据结构-队列的建立及使用(链表)

#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
using namespace std;

typedef int elemtype;

typedef struct QLnode{//用链表结点的方法来建立队列
	elemtype data;//结点的数据域
	struct QLnode *next;//结点的指针域
}QLnode,*Queuelist;
/*
这个结构体是定义了队列元素中的各个域
*/


typedef struct{//用于放指向QLnode的结构体类型
	Queuelist front;//队首指针
	Queuelist rear;//队尾指针
}LinkQueue;
/*
这个结构体是定义了队列指针类型,在主函数中新建一个LinkQueue类型,这个类型就是一个队列,队列中的两个指针分别指向头和尾
*/

LinkQueue Create(int n){//入列函数,Q是链队列类型,n是队列元素个数
	LinkQueue Q;
	Q.front=Q.rear=(Queuelist)malloc(sizeof(QLnode));//新建头指针和尾指针同时指向一个结点,作为头结点
	Q.front->next=NULL;//头结点指向空

	Queuelist QL;//队列的新结点
	int e;//队列元素的值

	cout<<"请输入队列元素的值:";
	for(int i=0;i<n;i++){//循环插入n个值到Q的数据域中

		QL=(Queuelist)malloc(sizeof(QLnode));//给新节点分配空间
		QL->next=NULL;//新节点指向空

		cin>>e;
		QL->data=e;//从键盘输入元素值

		Q.rear->next=QL;//尾指针指向新节点
		Q.rear=QL;//尾指针向后移
	}

	return Q;//函数返回
}

void Print(LinkQueue Q,int n){//出列函数
	Queuelist q;//队列指针

	cout<<"打印出的队列:";
	for(int i=0;i<n;i++){//循环输出n个数(从队首开始)

		q=Q.front->next;//q指针指向第一个结点
		cout<<q->data<<' ';//先输出队列第一个结点的值
		Q.front->next=q->next;//头结点指向第二个结点
		if(Q.rear==q)//如果队列只剩最后一个元素,用尾指针指向头指针
			Q.rear=Q.front;

		free(q);//释放q结点
	}	
}

void Gethead(LinkQueue Q){//取队头元素的值
	cout<<"输出队头元素:";
	if(Q.front!=Q.rear)//若不是空队列,输出队头元素?(此处似乎无法判断头指针和尾指针是否指向一个结点,笔者会尽力在以后的学习过程中能够解决这个问题!)
		cout<<Q.front->next->data;
	else printf("ERROR");
}


void main(){
	int n;
	LinkQueue Q;

	printf("请输入队列的元素个数:");//从键盘输入队列元素个数
	cin>>n;

	Q=Create(n);//入列函数
	printf("\n");

	Gethead(Q);//取头结点函数
	printf("\n");

	Print(Q,n);//出列函数

	system("pause");
}

猜你喜欢

转载自blog.csdn.net/qq_41596915/article/details/83040367