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

單鏈表的相對(duì)劣勢(shì)

  • 單鏈表的實(shí)現(xiàn)嚴(yán)重依賴指針
  • 數(shù)據(jù)元素中必須包含一個(gè)額外的指針域
  • 沒(méi)有指針的程序設(shè)計(jì)語(yǔ)言無(wú)法實(shí)現(xiàn)

靜態(tài)鏈表的定義

  • 順序表數(shù)組中的元素由兩個(gè)數(shù)據(jù)域組成:data和next
  • data域用于存儲(chǔ)數(shù)據(jù)
  • next域用于存儲(chǔ)下一個(gè)元素在數(shù)組中的下標(biāo)

靜態(tài)鏈表是在順序表的基礎(chǔ)上利用數(shù)組實(shí)現(xiàn)的單鏈表

創(chuàng)建靜態(tài)鏈表

獲取第pos個(gè)元素操作

  • 判斷線性表是否合法
  • 判斷位置是否合法
  • 由表頭開始通過(guò)next域移動(dòng)pos次后,當(dāng)前元素的next域即要獲取的元素在數(shù)組中的下標(biāo)

插入元素到位置pos操作

  • 判斷線性表是否合法
  • 判斷插入位置是否合法
  • 在數(shù)組中查找空閑位置index
  • 由表頭開始通過(guò)next域移動(dòng)pos次后盔沫,當(dāng)前元素的next域?yàn)橐迦氲奈恢?/li>
  • 將新元素插入
  • 線性表長(zhǎng)度加一

刪除第pos個(gè)元素操作

  • 判斷線性表是否合法
  • 判斷插入位置是否合法
  • 獲取第pos個(gè)元素
  • 將第pos個(gè)元素從鏈表中刪除
  • 線性表長(zhǎng)度減一

小結(jié)

  • 靜態(tài)鏈表其實(shí)是單鏈表的另外一種實(shí)現(xiàn)方式
  • 靜態(tài)鏈表的實(shí)現(xiàn)“媒介”不是指針而是數(shù)組
  • 靜態(tài)鏈表主要用于不支持指針的程序設(shè)計(jì)語(yǔ)言中
  • 靜態(tài)鏈表的實(shí)現(xiàn)是一種內(nèi)存管理的簡(jiǎn)易方法

代碼

StaticList.h

#ifndef _STATICLIST_H_
#define _STATICLIST_H_

typedef void StaticList;
typedef void StaticListNode;

StaticList* StaticList_Create(int capacity);

void StaticList_Destroy(StaticList* list);

void StaticList_Clear(StaticList* list);

int StaticList_Length(StaticList* list);

int StaticList_Capacity(StaticList* list);

int StaticList_Insert(StaticList* list, StaticListNode* node, int pos);

StaticListNode* StaticList_Get(StaticList* list, int pos);

StaticListNode* StaticList_Delete(StaticList* list, int pos);

#endif

StaticList.c

#include <stdio.h>
#include <malloc.h>
#include "StaticList.h"

#define AVAILABLE -1

typedef struct _tag_StaticListNode
{
    unsigned int data;
    int next;
} TStaticListNode;

typedef struct _tag_StaticList
{
    int capacity;
    TStaticListNode header;
    TStaticListNode node[];
} TStaticList;

StaticList* StaticList_Create(int capacity)
{
    TStaticList* ret = NULL;
    int i = 0;
    
    if( capacity >= 0 )
    {
        ret = (TStaticList*)malloc(sizeof(TStaticList) + sizeof(TStaticListNode) * (capacity + 1));
    }
    
    if( ret != NULL )
    {
        ret->capacity = capacity;
        ret->header.data = 0;
        ret->header.next = 0;
        
        for(i=1; i<=capacity; i++)
        {
            ret->node[i].next = AVAILABLE;
        }
    }
    
    return ret;
}

void StaticList_Destroy(StaticList* list)
{
    free(list);
}

void StaticList_Clear(StaticList* list)
{
    TStaticList* sList = (TStaticList*)list;
    int i = 0;
    
    if( sList != NULL )
    {
        sList->header.data = 0;
        sList->header.next = 0;
        
        for(i=1; i<=sList->capacity; i++)
        {
            sList->node[i].next = AVAILABLE;
        }
    }
}

int StaticList_Length(StaticList* list)
{
    TStaticList* sList = (TStaticList*)list;
    int ret = -1;
    
    if( sList != NULL )
    {
        ret = sList->header.data;
    }
    
    return ret;
}

int StaticList_Capacity(StaticList* list)
{
    TStaticList* sList = (TStaticList*)list;
    int ret = -1;
    
    if( sList != NULL )
    {
        ret = sList->capacity;
    }
    
    return ret;
}

int StaticList_Insert(StaticList* list, StaticListNode* node, int pos) 
{
    TStaticList* sList = (TStaticList*)list;
    int ret = (sList != NULL);
    int current = 0;
    int index = 0;
    int i = 0;
    
    ret = ret && (sList->header.data + 1 <= sList->capacity);
    ret = ret && (pos >=0) && (node != NULL);
    
    if( ret )
    {
        for(i=1; i<=sList->capacity; i++)
        {
            if( sList->node[i].next == AVAILABLE )
            {
                index = i;
                break;
            }
        }
        
        sList->node[index].data = (unsigned int)node;
        
        sList->node[0] = sList->header;
        
        for(i=0; (i<pos) && (sList->node[current].next != 0); i++)
        {
            current = sList->node[current].next;
        }
        
        sList->node[index].next = sList->node[current].next;
        sList->node[current].next = index;
        
        sList->node[0].data++;
        
        sList->header = sList->node[0];
    }
    
    return ret;
}

StaticListNode* StaticList_Get(StaticList* list, int pos) 
{
    TStaticList* sList = (TStaticList*)list;
    StaticListNode* ret = NULL;
    int current = 0;
    int object = 0;
    int i = 0;
    
    if( (sList != NULL) && (0 <= pos) && (pos < sList->header.data) )
    {
        sList->node[0] = sList->header;
        
        for(i=0; i<pos; i++)
        {
            current = sList->node[current].next;
        }
        
        object = sList->node[current].next;
        
        ret = (StaticListNode*)(sList->node[object].data);
    }
    
    return ret;
}

StaticListNode* StaticList_Delete(StaticList* list, int pos) 
{
    TStaticList* sList = (TStaticList*)list;
    StaticListNode* ret = NULL;
    int current = 0;
    int object = 0;
    int i = 0;
    
    if( (sList != NULL) && (0 <= pos) && (pos < sList->header.data) )
    {
        sList->node[0] = sList->header;
        
        for(i=0; i<pos; i++)
        {
            current = sList->node[current].next;
        }
        
        object = sList->node[current].next;
        
        sList->node[current].next = sList->node[object].next;
        
        sList->node[0].data--;
        
        sList->header = sList->node[0];
        
        sList->node[object].next = AVAILABLE;
        
        ret = (StaticListNode*)(sList->node[object].data);
    }
    
    return ret;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "StaticList.h"

int main(int argc, char *argv[])
{
    StaticList* list = StaticList_Create(10);
    
    int index = 0;
    
    int i = 0;
    int j = 1;
    int k = 2;
    int x = 3;
    int y = 4;
    int z = 5;
    
    StaticList_Insert(list, &i, 0);
    StaticList_Insert(list, &j, 0);
    StaticList_Insert(list, &k, 0);
    
    for(index=0; index<StaticList_Length(list); index++)
    {
        int* p = (int*)StaticList_Get(list, index);
        
        printf("%d\n", *p);
    }
    
    printf("\n");
    
    while( StaticList_Length(list) > 0 )
    {
        int* p = (int*)StaticList_Delete(list, 0);
        
        printf("%d\n", *p);
    }
    
    printf("\n");
    
    StaticList_Insert(list, &x, 0);
    StaticList_Insert(list, &y, 0);
    StaticList_Insert(list, &z, 0);
    
    printf("Capacity: %d Length: %d\n", StaticList_Capacity(list), StaticList_Length(list));
    
    for(index=0; index<StaticList_Length(list); index++)
    {
        int* p = (int*)StaticList_Get(list, index);
        
        printf("%d\n", *p);
    }
    
    StaticList_Destroy(list);
    
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末医咨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子架诞,更是在濱河造成了極大的恐慌拟淮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴忧,死亡現(xiàn)場(chǎng)離奇詭異很泊,居然都是意外死亡角虫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門委造,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戳鹅,“玉大人,你說(shuō)我怎么就攤上這事昏兆》懵玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵爬虱,是天一觀的道長(zhǎng)隶债。 經(jīng)常有香客問(wèn)我,道長(zhǎng)跑筝,這世上最難降的妖魔是什么死讹? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮曲梗,結(jié)果婚禮上赞警,老公的妹妹穿的比我還像新娘。我一直安慰自己稀并,他們只是感情好仅颇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碘举,像睡著了一般忘瓦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上引颈,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天耕皮,我揣著相機(jī)與錄音,去河邊找鬼蝙场。 笑死凌停,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的售滤。 我是一名探鬼主播罚拟,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼完箩!你這毒婦竟也來(lái)了赐俗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弊知,失蹤者是張志新(化名)和其女友劉穎阻逮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秩彤,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叔扼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年事哭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓜富。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳍咱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出食呻,到底是詐尸還是另有隱情流炕,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布仅胞,位于F島的核電站,受9級(jí)特大地震影響剑辫,放射性物質(zhì)發(fā)生泄漏干旧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一妹蔽、第九天 我趴在偏房一處隱蔽的房頂上張望椎眯。 院中可真熱鬧,春花似錦胳岂、人聲如沸编整。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掌测。三九已至,卻和暖如春产园,著一層夾襖步出監(jiān)牢的瞬間汞斧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工什燕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粘勒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓屎即,卻偏偏與公主長(zhǎng)得像庙睡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子技俐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容