資料結構(佇列--單鏈表表實現--不含隊頭尾指標)
這裡介紹下用單鏈表實現的佇列,不包含隊頭隊尾指標。
如圖
這裡介紹雙向連結串列的常用操作:
l 建立佇列
l 銷燬佇列
l 清空佇列
l 入隊
l 出隊
l 返回隊首元素
l 返回隊的大小
程式碼總分為三個檔案:
LinkQueue.h : 放置功能函式的宣告,以及表的宣告
LinkQueue.c : 放置功能函式的定義,以及表結點的定義
Main.c : 主函式,使用功能函式完成各種需求,一般用作測試
整體結構圖為:
這裡詳細說下入隊操作,出隊操作和返回隊首元素操作:
入隊操作:
如圖:
出隊操作:
如圖:
返回隊首元素:
如圖:
因為入隊和出隊操作不管是在表頭或表尾,都會進行遍歷。但是如果要返回隊首元素,當表頭為隊首時,就不用進行遍歷。所以綜合比較,當(表頭當作隊頭,表尾當作隊尾)時,較合適。
OK! 上程式碼:
LinkQueue.h :
- #ifndef _LINKQUEUE_H_
- #define _LINKQUEUE_H_
- typedefvoid LinkQueue;
- LinkQueue* LinkQueue_Create();
- void LinkQueue_Destroy(LinkQueue* queue);
- void LinkQueue_Clear(LinkQueue* queue);
- int LinkQueue_Append(LinkQueue* queue, void* item);
- void* LinkQueue_Retrieve(LinkQueue* queue);
- void* LinkQueue_Header(LinkQueue* queue);
- int LinkQueue_Length(LinkQueue* queue);
- #endif
LinkQueue.c :
- #include <stdio.h>
- #include "LinkList.h"
- #include "LinkQueue.h"
- typedefstruct _tag_LinkQueueNode
- {
- LinkListNode header;
- void* item;
- }TLinkQueueNode;
- LinkQueue* LinkQueue_Create()
- {
- return LinkList_Create();
- }
- void LinkQueue_Destroy(LinkQueue* queue)
- {
- LinkQueue_Clear(queue);
- LinkQueue_Destroy(queue);
- }
- void LinkQueue_Clear(LinkQueue* queue)
- {
- while(LinkQueue_Length(queue) > 0)
- {
- LinkQueue_Retrieve(queue);
- }
- }
- int LinkQueue_Append(LinkQueue* queue, void* item)
- {
- TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
- int ret = (NULL != item) && (NULL != node);
- if(ret)
- {
- node->item = item;
- ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue));
- }
- if(!ret)
- {
- free(node);
- }
- return ret;
- }
- void* LinkQueue_Retrieve(LinkQueue* queue)
- {
- TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0);
- void* ret = NULL;
- if(NULL != node)
- {
- ret = node->item;
- free(node);
- }
- return ret;
- }
- void* LinkQueue_Header(LinkQueue* queue)
- {
- TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0);
- void* ret = NULL;
- if(NULL != node)
- {
- ret = node->item;
- }
- return ret;
- }
- int LinkQueue_Length(LinkQueue* queue)
- {
- return LinkList_Length(queue);
- }
Main.c :
- #include <stdio.h>
- #include <stdlib.h>
- #include "LinkQueue.h"
- int main(void)
- {
- LinkQueue* queue = LinkQueue_Create();
- int a[10];
- int i = 0;
- for(i=0; i<10; i++)
- {
- a[i] = i;
- LinkQueue_Append(queue, a+i);
- }
- printf("Header: %d\n", *(int*)LinkQueue_Header(queue));
- printf("Length: %d\n\n", LinkQueue_Length(queue));
- while(LinkQueue_Length(queue) > 0)
- {
- printf("Retrieve : %d\n", *(int*)LinkQueue_Retrieve(queue));
- }
- LinkQueue_Destroy(queue);
- return 0;
- }
這裡介紹下用單鏈表實現的佇列,不包含隊頭隊尾指標。
如圖
這裡介紹雙向連結串列的常用操作:
l 建立佇列
l 銷燬佇列
l 清空佇列
l 入隊
l 出隊
l 返回隊首元素
l 返回隊的大小
程式碼總分為三個檔案:
LinkQueue.h : 放置功能函式的宣告,以及表的宣告
LinkQueue.c : 放置功能函式的定義,以及表結點的定義
Main.c : 主函式,使用功能函式完成各種需求,一般用作測試
整體結構圖為:
這裡詳細說下入隊操作,出隊操作和返回隊首元素操作:
入隊操作:
如圖:
出隊操作:
如圖:
返回隊首元素:
如圖:
因為入隊和出隊操作不管是在表頭或表尾,都會進行遍歷。但是如果要返回隊首元素,當表頭為隊首時,就不用進行遍歷。所以綜合比較,當(表頭當作隊頭,表尾當作隊尾)時,較合適。
OK! 上程式碼:
LinkQueue.h :
- #ifndef _LINKQUEUE_H_
- #define _LINKQUEUE_H_
- typedefvoid LinkQueue;
- LinkQueue* LinkQueue_Create();
相關推薦
資料結構(佇列--單鏈表表實現--不含隊頭尾指標)
這裡介紹下用單鏈表實現的佇列,不包含隊頭隊尾指標。 如圖 這裡介紹雙向連結串列的常用操作: l 建立佇列 l 銷燬佇列 l 清空佇列 l 入隊 l 出隊 l 返回隊首元素 l
資料結構之 佇列(Queue)的實現 Java
佇列 - 實現 為了實現佇列,我們可以使用動態陣列和指向佇列頭部的索引。 如上所述,佇列應支援兩種操作:入隊和出隊。入隊會向佇列追加一個新元素,而出隊會刪除第一個元素。 所以我們需要一個索引來指出起點。 這是一個供你參考的實現: // "static void mai
資料結構複習------------迴圈單鏈表實現約瑟夫問題
用連結串列求約瑟夫問題: 前面小編試過用順序表來實現約瑟夫問題,用的是連用起始結點加報數然後球餘出列,這次利用迴圈單鏈表來實現。可能思考不周,但歡迎各路大神賜教! 演算法思路 : 由於約瑟夫問題是n個人圍坐一圈,所以採用迴圈連結串列實現,又由於報數可
資料結構---迴圈佇列(順序表實現)
一、理論知識 待續 二、程式碼實現 1.佇列結構體定義 typedef struct lQueue { int* pBase; int size; int length; int front; int rear; }lQueue,*plQu
資料結構(連結串列的實現)
1.連結串列的實現:插入結點,想要動態分配記憶體,如果分配的記憶體為空,則記憶體分配失敗。 2.序號查詢:for迴圈查詢,關鍵字查詢:while迴圈 3.連結串列的缺點就是不管查詢,刪除都是的從頭結點開始遍歷。 4.如果資料項只有一個,則只用一個結構體,如果資料項有
資料結構之佇列C語言實現
C語言實現迴圈佇列:實現佇列需要理解先進先出的思想,可以先看一下資料機構的書籍,不做過多累述定義為順序表形式。typedef struct{ Elemtype data[MaxSize]; int front,rear; }Queue;MaxSize表示佇列最大值,其中f
資料結構4--佇列(java程式碼實現佇列的鏈式儲存)
1.什麼是佇列? 佇列也叫隊,時允許在一段進行擦汗如另一端進行刪除的運算受限的線性表。區別佇列和棧:棧時先進後出,佇列時先進先出。 &nbs
資料結構(棧與佇列) java實現
棧的相關定義 package StackDef; import java.util.Arrays; import java.util.EmptyStackException; /** * 通過陣列模擬棧 * @author tian * */ public cla
資料結構-迴圈佇列的基本操作函式實現(含全部程式碼)
主要包含以下函式: InitQueue(SqQueue &Q) 引數:迴圈佇列Q 功能:初始化迴圈佇列Q 時間複雜度:O(1) QueueEmpty(SqQueue Q) 引數:迴圈佇列Q
資料結構(c語言)——鏈佇列儲存結構及實現
是佇列鴨,FIFO,先進先出! 對於帶頭節點的和不帶頭節點的鏈佇列的操作有個小小的區別: 不帶頭結點的鏈佇列在入佇列的時候,第一個元素時要先判斷是否為空,再插入。而帶頭結點不需要,操作更方便些; 我是分割線-----------------------------
自己動手實現java資料結構(四)雙端佇列
自己動手實現java資料結構(四)雙端佇列 1.雙端佇列介紹 在介紹雙端佇列之前,我們需要先介紹佇列的概念。和棧相對應,在許多演算法設計中,需要一種"先進先出(First Input First Output)"的資料結構,因而一種被稱為"佇列(Queue)"的資料結構被抽象了出來(因為
資料結構及演算法——單鏈表逆轉(C語言)(不間斷更新)
題目來源:浙大程式設計類實驗輔助教學平臺 本題要求實現一個函式,將給定的單鏈表逆轉。 函式介面定義: List Reverse( List L ); 其中List結構定義如下: typedef struct Node *PtrToNode; stru
c語言實現通用資料結構(二):通用佇列
注意佇列中只儲存了指標,沒有儲存實際的資料。 標頭檔案 myQueue.h #ifndef MYQUEUE_H_INCLUDED #define MYQUEUE_H_INCLUDED #include "myList.h" typedef My
資料結構(三)——佇列及實現、迴圈佇列實現
一、佇列 佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇
資料結構之 佇列(Queue)的實現及簡單操作
在生活中我們經常會遇到排隊的事情,比如說排隊買東西,大家依次站一個隊,隊頭的人要比後面的人先買到東西,先到先得,然後買完東西就會離開這個隊 而我們平時為了解決在比如說打客服電話,排隊叫號之類的應用問題時我們就應用了 佇列 這種資料結構,實現先到先得,先入先出的排隊功能
資料結構——迴圈佇列(順序佇列)模板類實現
資料結構筆記3.3 順序佇列是用順序表實現的(即依託於陣列),這裡實現的是迴圈佇列,其實也可以不用迴圈,但是那樣的話,空間的利用效率就太低了,這就是”假溢位”問題,因為在陣列的前端可能還有空閒的位置(因為佇列中的資料是在動態變化的,可能出隊也可能入對)
資料結構(5)線性表之連結串列C++實現帶頭結點的單鏈表合併
題目 如何將有序連結串列合併成有序連結串列 假設頭指標為La和Lb的單鏈表分別為線性表LA和LB的儲存結構,現要歸併La和Lb得到單鏈表Lc。 思路點撥 按照第三篇文章的思想,需要設立三個指標pa,pb和pc,其中pa和
資料結構(c語言)——順序佇列儲存結構及實現
使用迴圈佇列,避免出現偽滿佇列的情況 判斷佇列為空的條件:rear == front; 判斷佇列為滿的條件:(rear+1)%MAXSIZE == front; 空出一個數組元素空間,用以區別開來滿佇列和空佇列。 一個順序佇列的結構: typedef struc
資料結構|順序佇列的實現(實驗3.3)
一、實驗目的 1、 熟練掌佇列的結構特點,掌握佇列的順序儲存和實現。 2、 學會使用佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模,建立一個順序佇列
資料結構-->(迴圈)佇列 【佇列的順序實現】ADT
#define ERROR 0 #define OK 1 #define MAXQSIZE 200 //!注意棧是沒有頭結點的 typedef int QElemType; typedef struct