資料結構-佇列的建立及使用(連結串列)
阿新 • • 發佈:2018-12-15
#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"); }