#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
今日推荐
周排行