靜態(tài)鏈表——數(shù)據(jù)結(jié)構(gòu)預(yù)習(xí)

其實(shí)一般有單鏈表的話寓辱,應(yīng)該用不著靜態(tài)鏈表赤拒。然而并不是什么編程語言都有指針诱鞠,這時(shí)靜態(tài)鏈表可以起到單鏈表的作用航夺。靜態(tài)鏈表的思考方式還蠻巧妙崔涂。
特點(diǎn):
1、靜態(tài)鏈表是一個(gè)足夠大的結(jié)構(gòu)體數(shù)組,大概是分成數(shù)據(jù)+游標(biāo)的形式帝雇。數(shù)組里面有數(shù)據(jù)的為一部分(姑且叫數(shù)據(jù)域吧)蛉拙,沒有數(shù)據(jù)的(即未使用的數(shù)組元素)叫做備用鏈表。
2吮廉、數(shù)組的第0個(gè)和最后1個(gè)元素作特殊處理畸肆,它們的data不存放數(shù)據(jù)轴脐。
3、數(shù)組的第0個(gè)元素的游標(biāo)存放備用鏈表第1個(gè)節(jié)點(diǎn)的下標(biāo)恬涧。
4碴巾、數(shù)組的最后一個(gè)元素的游標(biāo)存放數(shù)據(jù)域第1個(gè)節(jié)點(diǎn)的下標(biāo)(相當(dāng)于單鏈表的頭節(jié)點(diǎn))

優(yōu)點(diǎn):和動(dòng)態(tài)鏈表一樣厦瓢,刪除和插入元素時(shí)間復(fù)雜度低
不足:和數(shù)組一樣,需要提前分配一塊較大的空間碳锈、
可以參考一下這篇文章https://www.cnblogs.com/dongry/p/10210609.html
額……建議畫圖理解欺抗,圖畫得步驟較多售碳,不是很難畫,自己動(dòng)手吧。??
強(qiáng)烈推薦這篇https://blog.csdn.net/qq_37668436/article/details/104519005?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1寫得很棒贸人,但是不自己動(dòng)手寫是學(xué)不會(huì)的间景。主要參考這篇文章做筆記。

image.png

image.png

image.png

image.png

image.png

image.png

#include <iostream>
#include<stdlib.h>
using namespace std;
constexpr auto maxsize = 7;//本來是#define maxsize 7艺智,被vs建議修改為這樣

typedef struct node
{
    char data;//數(shù)據(jù)
    int cur;//游標(biāo)倘要,模擬鏈表的指針
}Node[maxsize];
void init(Node L);//創(chuàng)建備用鏈表
int getlength(Node L);//不包括頭尾節(jié)點(diǎn),求鏈表元素個(gè)數(shù)/數(shù)據(jù)域長度
int get(Node L);//提取空閑變量十拣,分配下標(biāo)
void insert(Node L,int i,char newdata);//靜態(tài)鏈表中i位置插入一個(gè)元素
void Free(Node L, int k);//釋放節(jié)點(diǎn)
bool Delete(Node L, int i, char* key);//刪除第i個(gè)元素
void Traverse(Node L);//遍歷

int main()
{
    Node L;
    cout << "初始化鏈表:";
    init(L);
    cout << "初始化后鏈表長度:" << getlength(L) << endl;
    cout << "插入a、b夭问、c泽西、d、e" << endl;
    insert(L, 1, 'a');
    insert(L, 1, 'b');
    insert(L, 1, 'c');
    insert(L, 1, 'd');
    insert(L, 1, 'e');
    cout << "插入后的長度:" << getlength(L) << ",遍歷鏈表得各元素分別為:";
    Traverse(L);
    char key;
    Delete(L, 2, &key);
    cout << "刪除的元素值為:" << key<<endl;
    cout << "插入后的長度:" << getlength(L) << ",遍歷鏈表得各元素分別為:";
    Traverse(L);

    return 0;
}
void init(Node L)
{
    for (int i = 0; i < maxsize - 1; i++)
    {
        L[i].cur = i + 1;//將每個(gè)數(shù)組分量鏈接到一起,最后一個(gè)元素指向的是尾節(jié)點(diǎn)
    }
    L[maxsize - 1].cur = 0;//備用鏈表的最后一個(gè)空元素的cur指向0缰趋,這一行不能省捧杉。
}
int getlength(Node L)
{
    int i = L[maxsize - 1].cur;//從倒數(shù)第一個(gè)數(shù)據(jù)域元素開始遍歷,很想單鏈表的
    int j = 0;
    while (i)
    {
        j++;
        i = L[i].cur;//相當(dāng)于就是p = p->next
    }
    return j;
}
int get(Node L)//新插入一個(gè)元素之后需要重新修改L[0].cur的值
{
    //若備用鏈表非空秘血,則返回分配的結(jié)點(diǎn)下標(biāo)味抖,否則返回 0(當(dāng)分配最后一個(gè)結(jié)點(diǎn)時(shí),該結(jié)點(diǎn)的游標(biāo)值為 0)即特點(diǎn)3的體現(xiàn)
    int i = L[0].cur;//獲取可以插入的位置 
    if (i)//如果不是空表
    {
        L[0].cur = L[i].cur;//更新L[0]為剛才插入位置的cur灰粮,用來記錄當(dāng)前鏈表新的可插入位置 
    }
    return i;//返回可插入位置 
}
void insert(Node L, int i, char newdata)
{
    if (i<1 || i>getlength(L) + 1)//判斷插入點(diǎn)是否合理
    {
        exit(1);
    }
    //找可插入的地方 
    int j = get(L);// W猩!粘舟!修改了上文說的第一個(gè)數(shù)红柱,文章見鏈接
    int k = maxsize - 1; //找鏈表頭 
    if (j)
    {//定位到插入的位置的前一個(gè)位置k 
        for (int l = 1; l <= i - 1; l++)
        {
            k = L[k].cur;//相當(dāng)于就是p = p->next
        }
        //插入操作 
        L[j].data = newdata;
        L[j].cur = L[k].cur;
        L[k].cur = j;
    }
}
void Free(Node L, int k)
{
    L[k].cur = L[0].cur;//這應(yīng)該是游標(biāo)不能重復(fù),換一下
    L[0].cur = k;//被刪除元素已經(jīng)變成了備用鏈表的第一個(gè)節(jié)點(diǎn)了
}
//刪除第i個(gè)元素

bool Delete(Node L, int i, char* key)
{
    if (i < 1 || i > getlength(L))
    {
        return false;
    }
    //找鏈表頭 
    int k = maxsize - 1;
    //定位到刪除的地方的前一個(gè) 
    for (int l = 1; l <= i - 1; l++)
    {
        k = L[k].cur;
    }
    int j = L[k].cur;//由k找到j(luò)蓖乘,像鏈表的next域锤悄,上一個(gè)找到下一個(gè)的尋法
    *key = L[j].data;
    L[k].cur = L[j].cur;//換一下游標(biāo)免得重復(fù)
    Free(L, j);
    return true;
}

//遍歷
void Traverse(Node L)
{
    int k = maxsize - 1;
    while (L[k].cur)
    {
        k = L[k].cur;
        cout<<L[k].data<<" ";
    }
    printf("\n");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嘉抒,隨后出現(xiàn)的幾起案子零聚,更是在濱河造成了極大的恐慌,老刑警劉巖些侍,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隶症,死亡現(xiàn)場離奇詭異,居然都是意外死亡岗宣,警方通過查閱死者的電腦和手機(jī)蚂会,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耗式,“玉大人胁住,你說我怎么就攤上這事趁猴。” “怎么了彪见?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵儡司,是天一觀的道長。 經(jīng)常有香客問我余指,道長捕犬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任酵镜,我火速辦了婚禮碉碉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淮韭。我一直安慰自己誉裆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布缸濒。 她就那樣靜靜地躺著,像睡著了一般粱腻。 火紅的嫁衣襯著肌膚如雪庇配。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天绍些,我揣著相機(jī)與錄音捞慌,去河邊找鬼。 笑死柬批,一個(gè)胖子當(dāng)著我的面吹牛啸澡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氮帐,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嗅虏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了上沐?” 一聲冷哼從身側(cè)響起皮服,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎参咙,沒想到半個(gè)月后龄广,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕴侧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年择同,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片净宵。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敲才,死狀恐怖裹纳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情归斤,我是刑警寧澤痊夭,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站脏里,受9級特大地震影響她我,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迫横,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一番舆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矾踱,春花似錦恨狈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贝搁,卻和暖如春吗氏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雷逆。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工弦讽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膀哲。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓往产,卻偏偏與公主長得像,于是被迫代替她去往敵國和親某宪。 傳聞我的和親對象是個(gè)殘疾皇子仿村,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355