1. 程式人生 > >[學習筆記]靜態連結串列

[學習筆記]靜態連結串列

本文基於"姓名標識-非商業性-相同方式分享 4.0國際"協議創作或轉載,轉載原創文章請註明來源於瘋子的自留地,否則請勿轉載或再轉載,謝謝合作:)

說明:這幾天有點忙,本來前幾天就應該寫了的推遲到了今天.

      寫在前面的話:如果您讀到此文,請允許我理解你已經學習了該部分知識,只是對此知識點有不解才被搜尋引擎指到這裡.如果不是,請自己去看相關資料結構知識.抱歉本文幫不到你:)

      首先,什麼是靜態連結串列呢?我自己的話說就是為那些沒有指標的語言設計的"連結串列"這種資料結構.其思想就是運用了一維結構陣列(當然N維也可以),該結構內不僅有資料域,同時還用一個int型來儲存我們的next值,即下一個資料的下標.這樣就可以模擬出連結串列的結構了.這樣增刪資料的時間複雜度就為O(1)了.因為這個陣列的長度是事先規定好了的,不能更改,所以才有了靜態連結串列這個名字.在Weiss的<<資料結構與演算法---C語言實現>>裡面稱此法為遊標實現法.

      既然明白了原理,那麼連結串列裡面的頭指標那些也應該在靜態連結串列裡面體現不是?不然也不能稱之為"連結串列"了.對於靜態連結串列,事先佔用一個結點也就是陣列的一個單元來儲存首結點的下標.同時再另外佔用一個結點用來儲存那些未被佔用的結點的下標.同時把這些結點也組成一個連結串列,<<大話>>上稱之為"備用連結串列".這個備用連結串列的頭指標的next值用來指向備用連結串列的頭結點的下標.同時,規定0為null.好了,

    但是看<<大話>>時有個疑惑,集中在兩個方面,即初始化連結串列和分配記憶體處.<<大話>>中說初始化的時候把0到MAXSIZE-2的next值都給設定為其值得下一個值的下標,這我能理解.但是到了分配記憶體函式時又說,如果分配成功會返回其記憶體的下標,若失敗則返回0.好了,假設MAXSIZE為10,即最大可以儲存8個數字,那麼如果我們此時先一次性給寫入7個數字,即L[1]-L[7]都存有值,而備用連結串列根據定義只剩一個結點,即L[8],根據初始化的函式,L[8]的next值應該是9.好了,我們假設現在插入一個數,具體插入哪裡先不管,肯定要用到分配記憶體函式,好了.給我們返回8,也正是備用連結串列的唯一一個結點的下標.但是....根據分配記憶體函式的原理,此時L[0].next的值應該是0,但是當我們再用一次分配記憶體函式或者跟蹤我們的靜態連結串列就會發現值居然是9.

怪了!就這個問題把我折騰了2天.google,baidu各種部落格都沒有人有這個疑問,難道是我理解錯了?可是按照這個寫法寫的程式是錯的!而我也在csdn一名程式猿的部落格留言了此問題,回覆我我的想法應該是對的,這種方法確實有缺陷.所以,我就用了下面的辦法,即在初始化時把連結串列可用的最後一個結點也就是當MAXSIZE為10是,L[8]的next賦值為0,而非9,這樣就解決了這個問題.而經過測試執行良好.所以再一次證明了只有不要盡信書

好了,以下是靜態連結串列的資料結構:

1 typedef struct Node{
2
char Data;
3 int Next;
4 }Node;
5
6 typedef struct Node List[MAXSIZE];

1.連結串列初始化:

01 BOOL InitializeStaticList(List L)//初始化靜態連結串列時L[0]用來表示備用連結串列的頭指標,而L[MAXSIZE-1]則用來表示存資料的連結串列的頭指標
02 {
03 int temp;
04
05 for(temp=0;temp<MAXSIZE-1;temp++)//
06 L[temp].Next=temp+1;//指定下一個資料的下標
07

相關推薦

[學習筆記]靜態連結串列

本文基於"姓名標識-非商業性-相同方式分享 4.0國際"協議創作或轉載,轉載原創文章請註明來源於瘋子的自留地,否則請勿轉載或再轉載,謝謝合作:) 說明:這幾天有點忙,本來前幾天就應該寫了的推遲到了今天.       寫在前面的話:如果您讀到此文

Java學習筆記連結串列

連結串列是一種非常常見和重要的資料結構,在java裡也可以通過引用傳遞的方式進行實現。 1、基本概念 什麼是連結串列,通俗的可以理解為一輛貨車,火車頭代表連結串列表頭,後面的每一節車廂表示一個連結串列的結點,每一個結點除了儲存本節點的資料以外,還得帶上下一個結點的引用,也就是除了車尾

連結串列學習(一)靜態連結串列的構造

#include<stdio.h> typedef struct Student //宣告結構體型別 struct Student { int

資料結構學習筆記-迴圈連結串列(C語言實現)

  迴圈連結串列的概念主要就是讓單鏈表的尾節點的指標不為空並且指向頭節點。像這樣的迴圈連結串列和普通單鏈表除了判斷條件幾乎沒有任何區別,判斷條件就是從p->next是否為空改為p->next是否等於頭節點,如果等於頭節點則迴圈結束。#include <std

[學習筆記][圖解]連結串列結構——雙向迴圈連結串列

今天在研究核心層通過PEB取程式模組地址時遇到了這個雙鏈表結構,因為接觸連結串列不多,所以一開始自己給理解蒙了,後來一頓查資料+問大佬,理清楚了這個邏輯,作下筆記,謹防忘記。 回到正題,PEB結構裡面有很多成員,很多成員及其子成員都有定義為 LIST_ENTRY 這個結構,

學習筆記 5)靜態連結串列

靜態連結串列(static linked list):用陣列來描述的連結串列,用陣列元素的下標來模擬單鏈表的指標。這種描述方法叫做遊標實現法。 遊標 5 2 3 4 5 6 7 … 1 資料 A

靜態連結串列相關演算法學習

大話資料結構學習筆記—靜態連結串列學習 c語言真是好東西,它具有指標能力,使得它可以非常容易地操作記憶體中的地址和資料,這比其他高階語言更加靈活方便。 後來的面向物件的語言,如java、C#等,雖然不使用指標,但是因為啟用了物件引用機制,從某種角度也間接實現了指標的 某些作

資料結構筆記(三)靜態連結串列的實現和基本操作

一、靜態連結串列的定義 用資料替代指標,來描述單鏈表。首先,資料的元素由兩個資料域組成,data和cur。資料域data,用來存放資料元素,即要處理的資料;遊標cur相當於單鏈表中的next指標。 //線性表的靜態單鏈表儲存結構 #define MAXSIZ

資料結構高分筆記1327||HNCU1327:演算法2-13~2-16:靜態連結串列

靜態連結串列是使用順序儲存結構來實現的連結串列。嚴蔚敏《資料結構(C語言版)》在介紹靜態連結串列時使用的是一個姓氏列表。 圖1是書本上的靜態連結串列示例,圖(a)是初始化後插入了8個姓氏的連結串列,圖(b)是在第5個元素前插入了“SHI”而刪除了“WANG”的結果。 圖1:靜態連結串列示例 (a)修改前

學習《資料結構與演算法》筆記02 連結串列

連結串列 陣列結構的缺點: 1.陣列的大小是固定的; 2.無序陣列中,查詢效率很低;查詢O(N),插入O(1) 3.有序

python3學習筆記 靜態方法,類方法,屬性方法

SM clas ssm inf pytho ID 靜態方法 delet 分享 靜態方法@statitmetod   只是名義上歸類管理,實際上在靜態方法裏訪問不了類或實例中的任何屬性 類方法@classmethed   只能訪問類變量,不能訪問實例變量 屬性方法@prope

九章演算法筆記 6.連結串列與陣列 Linked List & Array

刷題注意事項 cs3k.com 每道題需要總結的 思路 演算法 核心程式碼 這個題得到的啟示!!!重點是bug free的能力   linked list理解 結果兩個都是 1 2 3 node是存在main函式裡的區域性變數, 還是全域性變數? 區

leetcode筆記_連結串列的遍歷與刪除(虛擬頭結點的使用)

203. 移除連結串列元素 刪除連結串列中等於給定值 val 的所有節點。 示例: 輸入: 1->2->6->3->4->5->6, val = 6 輸出: 1->2->3->4->

Redis設計與實現筆記(二) | 連結串列結構

沒錯,本篇我們要說一說連結串列在Redis中的應用。本打算寫Redis中的列表,但想來想去覺得列表僅僅是Redis連結串列的一部分,並不能完全說明連結串列這一資料結構在Redis中的應用。那就說說資料結構連結串列吧。小夥伴們,開始啦! 2.1 資料結構:連結串列 C語言中沒有內建這種資料結構

實驗三:用雙鏈表、靜態連結串列以及間接定址實現基本的學生管理系統

實驗目的:鞏固線性表的資料的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。 實驗內容:建立一個由n個學生成績的線性表,n的大小由自己確定,每個學生的成績資訊由自己確定,實現資料的對錶進行插入、刪除、查詢等操作。 (1)用雙鏈表實現 源程式: #incl

資料結構實驗三靜態連結串列學生資訊

#include<iostream>   #include<string>   using namespace std;      //靜態連結串列的儲存結構   c

muduo網路庫學習筆記(五) 連結器Connector與監聽器Acceptor

本篇繼續為前面封裝的EventLoop新增事件,到現在共給EventLoop添加了兩個fd,Timerfd,EventFd分別用於處理定時任務和通知事件. 今天新增的Acceptor會增加另一個fd,此fd是是一個socket,用於監聽套接字連線.同時封裝非組賽網路程式設計中的connect(2)的

C++ 靜態連結串列基本演算法實現

C++ 靜態連結串列基本演算法實現 #ifndef StaticLinkList_h #define StaticLinkList_h const int MAXSIZE = 100; template <class T> struct StaticNode{ T data;

靜態連結串列的建立、插入、刪除···

#include"stdio.h" #include"stdlib.h" #define MAXSIZE 1000 bool flag=true; typedef struct MyStruct { int data; int cur; }stlist[MAXSIZE]; //初始化連結

php連結串列筆記連結串列的檢測

<?php /** * Created by PhpStorm. * User: huizhou * Date: 2018/12/2 * Time: 11:48 */ /** * 連結串列的檢測 * Class CheckCirclesList */