用迴圈連結串列實現佇列
佇列記住的是back的地址
構造時back指向back,表示空佇列;
//測試檔案#include<iostream> #include<ctime>//... #include<stdlib.h>//隨機數要的 using namespace std; template<typename T> class listNode//只是一個節點 { public: T NodeData; listNode *next; listNode(T data, listNode * ne){ NodeData = data; next = ne; } listNode(){ NodeData = NULL; next = NULL; } }; template<typename T> class Queue { public: Queue(); Queue(const Queue<T> & or); void enqueue(const T & item);// void dequeue();// const T & front() const; bool empty() const;// void display() const; Queue & operator =(const Queue<T> &or); ~Queue(); private: listNode<T>* myBack; }; template<typename T> Queue<T>::Queue(){ myBack = new listNode<T>(); myBack->next = myBack; }//這個myback已經成了最簡單的迴圈列表,指向它自己,這個myback都是留著不放東西的,也將是是否為空的判斷依據! template<typename T> Queue<T>::Queue(const Queue<T>& or) { myBack = new listNode<T>(); myBack->next = myBack; listNode<T> *pr = or.myBack->next,*pt=myBack->next; myBack->NodeData = or.myBack->NodeData; myBack->next = myBack; while (pr !=or.myBack) { pt = new listNode<T>(NULL, myBack->next); myBack->NodeData = pr->NodeData; myBack->next = pt; myBack = pt; pr = pr->next; } } template<typename T> Queue<T>::~Queue() { listNode<T> *pr=myBack->next,*pt; while (pr != myBack) { pt = pr->next; delete pr; pr = pt; } } template<typename T> void Queue<T>::enqueue(const T & item)//新增咯,感覺是除了構造最重要的函式 { //這裡是這樣的:先新建一個節點記住myback的next,這樣才能保證是個迴圈的圈~(因為最後這個節點會變成myback); listNode<T> *pr; pr = new listNode<T>(NULL, myBack->next);//記住myback的下一個就是第一個的地址; myBack->NodeData = item;//把要新增的節點的值賦給當前的最後一個; myBack->next = pr;//指向新節點,將是新的myback; myBack = pr;//這樣myback就後移了 }//其實就是將新節點插在myback前面,而且沒有遍歷連結串列。 template<typename T> bool Queue<T>::empty() const { return myBack == myBack->next; }//就和剛構造的時候一樣,當就剩下一個myback的時候哦就是空了; template<typename T> void Queue<T>::dequeue()//刪除第一個節點。也就是myback間隔跳了一個,然後哦把跳過的那一個的空間給還了; { listNode<T> *pr; try { if (empty())//先判斷是不是空的,空的不能刪,給它報錯 throw out_of_range("Queue<>::dequeue() :empty queue"); else { pr = myBack->next;//pr記住myback的next(其實就是第一個了),為了跳過第一個有了第二句。。 myBack->next = pr->next;//跳過了 delete pr;//還空間 } } catch (exception const& ex)//抓異常的 { cerr << "Exception: " << ex.what() << endl; } } template<typename T> const T & Queue<T>::front() const { listNode<T> *pr; pr = myBack->next; try { if (empty()) throw out_of_range("Queue<>::dequeue() :empty queue"); else return pr->NodeData; } catch (exception const& ex) { cerr << "Exception: " << ex.what() << endl; } } template<typename T> void Queue<T>::display() const { listNode<T> *pr=myBack->next; if (empty()) { cout << "Queue<>::dequeue() :empty queue\n"; return; } while (pr!=myBack) { cout << pr->NodeData<<" "; pr = pr->next; } cout << endl; } template<typename T> Queue<T> & Queue<T>::operator =(const Queue<T> &or) { Queue<T>::~Queue(); myBack = new listNode<T>(); myBack->next = myBack; listNode<T> *pr = or.myBack->next, *pt = myBack->next; myBack->NodeData = or.myBack->NodeData; myBack->next = myBack; while (pr != or.myBack) { pt = new listNode<T>(NULL, myBack->next); myBack->NodeData = pr->NodeData; myBack->next = pt; myBack = pt; pr = pr->next; } return *this; }
#include"Queue.h" using namespace std; int main() { Queue<int> que; int i = 1; int num; srand(unsigned int(time(0))); cout << "隨機產生的從0~99的數字20個:" << endl; for (; i <= 20; i++) { num = rand() % 100; cout << num << " "; que.enqueue(num); } cout << endl<<endl<<endl; system("pause"); que.display(); system("pause"); Queue<int> que2(que), que3 = que; //que2.display(); //que3.display(); //system("pause"); cout << "開始刪除\n"; while (!que.empty()) { cout << que.front() <<endl; que.dequeue(); } cout << endl; system("pause"); que.dequeue(); system("pause"); que.display(); system("pause"); cout<<que.front(); system("pause"); cout << "que2 以及que3 未被刪\n"; que2.display(); que3.display(); system("pause"); return 0; }
相關推薦
用迴圈連結串列實現佇列
佇列記住的是back的地址 構造時back指向back,表示空佇列; #include<iostream> #include<ctime>//... #include<stdlib.h>//隨機數要的 using namespac
Java用連結串列實現佇列
佇列--先入先出 棧---後入先出 連結串列實現佇列和棧。首先我們需要構建一個連結串列。連結串列有哪幾要素? 1、連結串列本身的value 2、連結串列的next指標,next指標指的還是同樣型別的值。 下邊看程式碼 public class Element&l
佇列C++ | 用連結串列實現佇列_2
用連結串列實現佇列 /*Queue - Linked List implementation*/ #include<stdio.h> #include<stdlib.h> struct Node { int data; struct Node* next;
用連結串列實現佇列
所有的資料結構都可以大致分為兩類,由連續單位構成或者由離散單位構成,具體到實體也就是陣列實現或者連結串列實現。陣列實現的資料結構方便查詢和修改但不方便增刪,連結串列實現的資料結構則剛好相反,適於增刪卻不便於查詢。 今天我們用連結串列來實現佇列。 我
用連結串列實現佇列--鏈式佇列
/* 一、關於鏈式佇列的約定(目的是在C語言中描述方便) 1.定義: (1)佇列是一種先進先出的線性表; (2)它只允許在表的一端進行入隊,在另一端進行出隊操作。在佇列中,允許插入的一端 叫隊尾,允許刪除的一端較隊頭,即入隊只能從隊尾入,出隊只
用迴圈連結串列解決約瑟夫環的問題
約瑟夫環問題簡介 約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出
java版資料結構與演算法—連結串列實現佇列
package com.zoujc.QueueLink; /** * 連結串列實現佇列 */ class FirstLastList { private Link first; private Link last; public FirstLastList(){
實驗三 用靜態連結串列實現學生成績管理系統
#include<iostream.h> #include<stdlib.h> typedef int ElemType; typedef int DataType; const int MaxSize=100; typedef struct { ElemType data
資料結構之連結串列實現佇列
#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define OK 1#define ERROR 0typedef struct Node{ int data; struct Node *next;}Node,*L
連結串列實現佇列
這次寫的還算正規,稍微壓縮了一下程式碼,但是不影響閱讀 畫個圖幫助理解: F->0->0->0<-R 第一個0不存資料 #include<stdio.h> #include<malloc.h> #include&l
約瑟夫環問題(迴圈連結串列實現)
約瑟夫環問題,n個人圍成一圈,報數到m的人出列,直至n個人全部出列,問出列人的順序 手寫迴圈連結串列模擬實現 #include<stdio.h> #include<stdlib.h> typedef struct SingleNode {
約瑟夫問題(陣列與迴圈連結串列實現)
約瑟夫問題 一個旅行社要從n名旅客中選出一名幸運旅客,為他提供免費環球旅行服務。方法是,大家站成圈,然後選定一個m,從第1個人開始報數,報到m時,這個人OUT,然後從下一個人開始重新從1報數,重複這個過程,直到最後剩下一個人就是幸運之星。問題就是誰是幸運者呢?
【資料結構】帶有尾指標的連結串列:連結串列實現佇列
前面寫了用動態陣列實現佇列,現在我將用帶有尾指標的連結串列實現佇列。 我們知道佇列需要在兩端進行操作,如果是以普通連結串列進行底層實現的佇列,在入隊時需要找到最後一個節點才能進行新增元素,這樣相當於遍歷一遍連結串列,從而造成巨大的時間浪費。 為了解決這個問題,我們引入了尾
帶頭結點的迴圈連結串列表示佇列, 並且只設一個指標指向隊尾元素結點, 試編寫相應的佇列初始化,入佇列和出佇列的演算法
資料結構演算法題(假設以帶頭結點的迴圈連結串列表示佇列, 並且只設一個指標指向隊尾元素結點(注意不設頭指標) 試編寫相應的佇列初始化,入佇列和出佇列的演算法!) /* 資料結構演算法題
資料結構——連結串列實現佇列(泛型)
package Test; public class LinkedListQueue { public static void main(String[] args) { // TODO Auto-generated method stub Queue <Integer>
淺談雙向連結串列的逆轉以及用雙向連結串列實現malloc/free/realloc
雙向連結串列因為在Linux核心廣泛使用,且能較好地考察對指標的理解,所以它的增刪、逆轉,以及如何用它來實現malloc/free/realloc等問題就成了技術型公司的偏好。 本篇第一部分談雙向連結串列的建立、增、刪,不想閱讀的讀者可以直接跳過,第二部分談如何實現
C++控制檯迴圈連結串列實現貪吃蛇
-stdafx.h 為了簡化程式定義一些巨集和全域性變數 #ifndef __STDAFX_H__ #define __STDAFX_H__ // ============上下左右=========
稀疏矩陣的加法(用十字連結串列實現A=A+B)
描述: 輸入兩個稀疏矩陣A和B,用十字連結串列實現A=A+B,輸出它們相加的結果。 輸入: 第一行輸入四個正整數,分別是兩個矩陣的行m、列n、第一個矩陣的非零元素的個數t1和第二個矩陣的非零元素的個數t2,接下來的t1+t2行是三元組,分別是第一個矩陣的資料和第二個矩
C語言連結串列實現佇列操作
還是操作佇列,但是這次換成連結串列,但是要注意出隊的操作。 一般的思維是在出隊的時候,刪除頭結點的下一個節點,這樣的話確實可以將佇列中的節點全部刪除,但是如果我們將最後一個節點刪除的時候,我們的演算法就將tail指標賦值為NULL,這時如果再進行入隊操作的時候,就會發生段錯
利用雙向迴圈連結串列實現任意長的整數進行加法運算
【問題描述】 設計一個實現任意長的整數進行加法運算的演示程式 。 【基本要求】 利用雙向迴圈連結串列實現長整數的儲存,每個結點含一個整形變數。輸入和輸出形式:按中國對於長整數的表示習慣,每四位一組,組間用逗號隔開。 【測試資料】 (1)0;0;應輸出“0”