1. 程式人生 > >資料結構-佇列的建立及使用(連結串列)

資料結構-佇列的建立及使用(連結串列)

#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");
}