原來(lái)你是這樣的數(shù)據(jù)結(jié)構(gòu)之順序表結(jié)構(gòu)

概念

順序表(Sequential List) 就是按照順序存儲(chǔ)方式存儲(chǔ)的線性表,該線性表的結(jié)點(diǎn)按照邏輯次序一次存放在計(jì)算機(jī)的一組連續(xù)的存儲(chǔ)單元中.
由于順序表示一次存放的,只要知道了該順序表的首地址及每個(gè)數(shù)據(jù)元素所占用的存儲(chǔ)長(zhǎng)度,那么就很容易計(jì)算出任何一個(gè)數(shù)據(jù)元素
所在的位置.
如下圖:

image
image

準(zhǔn)備數(shù)據(jù)

下面我們開(kāi)始順序表的程序設(shè)計(jì),首先需要準(zhǔn)備數(shù)據(jù),也就是準(zhǔn)備在順序表中需要用到的變量及數(shù)據(jù)結(jié)構(gòu)等.代碼如下:

static final int MAXLEN = 100;                        //定義順序表的最大長(zhǎng)度

class DATA                                            //存儲(chǔ)在數(shù)據(jù)結(jié)點(diǎn)的數(shù)據(jù),可以當(dāng)做學(xué)生
{
    String key;
    String name;
    int age;
}

class SLType                                          //定義順序表結(jié)構(gòu)
{
    DATA [] ListData = new DATA[MAXLEN];              //保存順序表的結(jié)構(gòu)數(shù)據(jù)
    int ListLen;                                      //順據(jù)表已存結(jié)點(diǎn)的數(shù)量
}

上面的代碼中,定義了順序表的最大長(zhǎng)度MAXLEN,順序表的數(shù)據(jù)元素DATA及順序表的類(lèi)SLType,ListLen為順序表已存結(jié)點(diǎn)的
數(shù)量,即當(dāng)前順序表的長(zhǎng)度,ListData是一個(gè)對(duì)象數(shù)組,用來(lái)存放各個(gè)數(shù)據(jù)結(jié)點(diǎn).
由于我們用java語(yǔ)言中數(shù)組都是從下表0開(kāi)始的,在這里,為了講述和理解的方便,從下標(biāo)1開(kāi)始記錄數(shù)據(jù)結(jié)點(diǎn),下標(biāo)0的位置不用.

初始化順序表

在使用順序表之前,首先要?jiǎng)?chuàng)建一個(gè)空的順序表,這里我們只需要設(shè)置順序表的結(jié)點(diǎn)數(shù)量ListLen為0就可以了

public void SLInit(SLType SL){
    SL.ListLen = 0;
}

計(jì)算順序表的長(zhǎng)度

由于ListLen就是代表順序表已存結(jié)點(diǎn)的數(shù)量,所以直接返回它就可以了.

public int SLLength(SLType SL){
    return SL.ListLen;
}

插入結(jié)點(diǎn)

插入結(jié)點(diǎn)就是在順序表的第i個(gè)位置插入一個(gè)新的結(jié)點(diǎn),使得其后的所有結(jié)點(diǎn)都向后移動(dòng)一個(gè)位置,也就是編號(hào)依次加1,
線性表的長(zhǎng)度變?yōu)閚+1,插入結(jié)點(diǎn)的難點(diǎn)在于隨后的每個(gè)位置都需要進(jìn)行移動(dòng).

public int Insert(SLType SL,int n,DATA data){
        int i;
        if(SL.ListLen>=MAXLEN){                                //判斷順序表是否已滿(mǎn)
            System.out.println("順序表已滿(mǎn)罗洗,不能插入結(jié)點(diǎn)钞馁!\n");
            return 0;
        }
        if(n<1||n>SL.ListLen+1){                               //判斷插入符號(hào)是否正確
            System.out.println("插入元素序號(hào)錯(cuò)誤周伦,不能插入元素!\n");
            return 0;
        }     
        for (int j = SL.ListLen; j>n; j--) {                     //將順序表中的數(shù)據(jù)向后移動(dòng)
            SL.ListData[j+1]=SL.ListData[j];
        }
        SL.ListData[n]=data;                                    //插入位置
        SL.ListLen++;
        return 1;                                               //成功插入,返回1
    }

在上述代碼中,在程序中首先判斷順序表結(jié)點(diǎn)數(shù)量是否已經(jīng)滿(mǎn)了,以及插入結(jié)點(diǎn)后是否正確,所有條件都滿(mǎn)足后,然后將順序表中數(shù)據(jù)向后移動(dòng)一個(gè)位置,同時(shí)插入結(jié)點(diǎn),并更新結(jié)點(diǎn)的數(shù)量.

追加結(jié)點(diǎn)

追加結(jié)點(diǎn)因?yàn)椴恍枰苿?dòng)數(shù)據(jù),所以事先起來(lái)比較簡(jiǎn)單:

public int SLAdd(SLType SL,DATA data){
        
        if(SL.ListLen >= MAXLEN){                               //判斷是否已滿(mǎn)
            System.out.println("順序表已滿(mǎn),不能再添加結(jié)點(diǎn)了");
            return 0;
        }
        SL.ListData[++SL.ListLen] = data;
        return 1;
}

刪除結(jié)點(diǎn)

刪除結(jié)點(diǎn)即刪除線性表L中第i個(gè)結(jié)點(diǎn),使得其后的所有結(jié)點(diǎn)便后依次減一,刪除一個(gè)結(jié)點(diǎn)之后,線性表L的長(zhǎng)度變?yōu)閚-1,刪除類(lèi)似添加,刪除后需要進(jìn)行大量的數(shù)據(jù)移動(dòng).

public int SLDeleteType(SLType SL,int n){
        int i;
        if(n<1||n>SL.ListLen+1){                               //判斷插入符號(hào)是否正確
            System.out.println("刪除元素符號(hào)錯(cuò)誤怔匣!\n");
            return 0;
        }
        
        for (i = n; i <= SL.ListLen; i++) {                    //順序表中的元素向前移動(dòng)
            SL.ListData[n+1] = SL.ListData[n];
        }
        
        SL.ListLen--;                                        //順序表的元素?cái)?shù)量減一
        return 1;
    }

查找結(jié)點(diǎn)

查找結(jié)點(diǎn)就是根據(jù)線性表L中查找x的結(jié)點(diǎn),并返回該結(jié)點(diǎn)在L中位置,如果沒(méi)有找到該結(jié)點(diǎn),則返回一個(gè)錯(cuò)誤標(biāo)識(shí),根據(jù)x的不同,
有兩種方式來(lái)查找,一種是x是結(jié)點(diǎn)位置,直接同x返回該結(jié)點(diǎn)的數(shù)據(jù),如果x是關(guān)鍵字,則通過(guò)比對(duì)關(guān)鍵字,然后返回x的位置.
1.按照序號(hào)查找結(jié)點(diǎn)

public DATA SLFindByNum(SLType SL,int n){                 //根據(jù)序號(hào)返回?cái)?shù)據(jù)元素
        if(n<1||n>SL.ListLen+1){
            System.out.println("查找符號(hào)錯(cuò)誤!\n");
            return null;
        }
        return SL.ListData[n];
    }

2.按照關(guān)鍵字查找結(jié)點(diǎn)

public int SLFindByCout(SLType SL,String key){           //按照關(guān)鍵字查找元素
        int j;
        for (j = 1; j < SL.ListLen; j++) {
            if(SL.ListData[j].key.compareTo(key)==0){
                return j;
            }
        }
        return 0;
    }

下面是所有代碼:

package SequentialList;

public class SLType {
    static final int MAXLEN = 100;
    //定義順序表結(jié)構(gòu)
    DATA [] ListData = new DATA[MAXLEN+1];//保存順序表的結(jié)構(gòu)數(shù)組
    int ListLen;                          //順序表已存節(jié)點(diǎn)的數(shù)量
    /**
     * 初始化順序表
     * @param SL
     */
    public void SLInit(SLType SL){
        SL.ListLen=0;//初始化空表
    }
    /**
     * 返回順序表的元素?cái)?shù)量
     */
    public int SLLength(SLType SL){
        return SL.ListLen;
    }
    /**
     * 插入結(jié)點(diǎn)
     * 插入結(jié)點(diǎn)就是在線性表的第i個(gè)位置插入一個(gè)新的結(jié)點(diǎn),使得其后的結(jié)點(diǎn)編號(hào)依次加1,這時(shí),插入一個(gè)結(jié)點(diǎn)后,線性表的長(zhǎng)度L將變?yōu)?     * n+1,插入結(jié)點(diǎn)的難點(diǎn)在于隨后的每個(gè)結(jié)點(diǎn)的數(shù)據(jù)都要向后移動(dòng)
     * @return
     */
    public int Insert(SLType SL,int n,DATA data){
        int i;
        if(SL.ListLen>=MAXLEN){                                //判斷順序表是否已滿(mǎn)
            System.out.println("順序表已滿(mǎn)绊茧,不能插入結(jié)點(diǎn)跌帐!\n");
            return 0;
        }
        if(n<1||n>SL.ListLen+1){                               //判斷插入符號(hào)是否正確
            System.out.println("插入元素序號(hào)錯(cuò)誤,不能插入元素翎冲!\n");
            return 0;
        }     
        for (int j = SL.ListLen; j>n; j--) {                     //將順序表中的數(shù)據(jù)向后移動(dòng)
            SL.ListData[j+1]=SL.ListData[j];
        }
        SL.ListData[n]=data;                                    //插入位置
        SL.ListLen++;
        return 1;                                               //成功插入,返回1
    }
    
    /**
     * 增加元素到順序表尾部
     * @param SL
     * @param data
     * @return
     */
    public int SLAdd(SLType SL,DATA data){
        
        if(SL.ListLen >= MAXLEN){                               //判斷是否已滿(mǎn)
            System.out.println("順序表已滿(mǎn),不能再添加結(jié)點(diǎn)了");
            return 0;
        }
        SL.ListData[++SL.ListLen] = data;
        return 1;
    }
    /**
     * 刪除順序表中的數(shù)據(jù)元素
     * 順序表刪掉第i個(gè)結(jié)點(diǎn),那么之后的所有結(jié)點(diǎn)的位置都需要向前移動(dòng)一個(gè)位置
     * @return
     */
    public int SLDeleteType(SLType SL,int n){
        int i;
        if(n<1||n>SL.ListLen+1){                               //判斷插入符號(hào)是否正確
            System.out.println("刪除元素符號(hào)錯(cuò)誤垂睬!\n");
            return 0;
        }
        
        for (i = n; i < =SL.ListLen; i++) {                    //順序表中的元素向前移動(dòng)
            SL.ListData[n+1] = SL.ListData[n];
        }
        
        SL.ListLen--;                                        //順序表的元素?cái)?shù)量減一
        return 1;
    }
    /**
     * 按照序號(hào)查找結(jié)點(diǎn)
     * @return
     */
    public DATA SLFindByNum(SLType SL,int n){                 //根據(jù)序號(hào)返回?cái)?shù)據(jù)元素
        if(n<1||n>SL.ListLen+1){
            System.out.println("查找符號(hào)錯(cuò)誤!\n");
            return null;
        }
        return SL.ListData[n];
    }
    /**
     * 按照關(guān)鍵字查找結(jié)點(diǎn)  返回結(jié)點(diǎn)序號(hào)
     * @return
     */
    public int SLFindByCout(SLType SL,String key){           //按照關(guān)鍵字查找元素
        int j;
        for (j = 1; j <= SL.ListLen; j++) {
            if(SL.ListData[j].key.compareTo(key)==0){
                return j;
            }
        }
        return 0;
    }
    /**
     * 返回所有結(jié)點(diǎn)
     * @return
     */
    public int SLAll(SLType SL){
        int i;
        for(i =1;i<=SL.ListLen;i++){
            System.out.printf("(%s,%s,%d)\n",SL.ListData[i].key,SL.ListData[i].name,SL.ListData[i].age);
        }
        return i;
    }
}

上面就是順序表的java代碼實(shí)現(xiàn).
原來(lái)你是這樣的數(shù)據(jù)結(jié)構(gòu)之鏈表結(jié)構(gòu)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驹饺,隨后出現(xiàn)的幾起案子钳枕,更是在濱河造成了極大的恐慌,老刑警劉巖赏壹,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鱼炒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蝌借,警方通過(guò)查閱死者的電腦和手機(jī)昔瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骨望,“玉大人硬爆,你說(shuō)我怎么就攤上這事∏骛” “怎么了缀磕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)劣光。 經(jīng)常有香客問(wèn)我袜蚕,道長(zhǎng),這世上最難降的妖魔是什么绢涡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任牲剃,我火速辦了婚禮,結(jié)果婚禮上雄可,老公的妹妹穿的比我還像新娘凿傅。我一直安慰自己,他們只是感情好数苫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布聪舒。 她就那樣靜靜地躺著,像睡著了一般虐急。 火紅的嫁衣襯著肌膚如雪箱残。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天止吁,我揣著相機(jī)與錄音被辑,去河邊找鬼。 笑死敬惦,一個(gè)胖子當(dāng)著我的面吹牛盼理,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俄删,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼榜揖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勾哩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起举哟,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤思劳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后妨猩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體潜叛,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年壶硅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了威兜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庐椒,死狀恐怖椒舵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情约谈,我是刑警寧澤笔宿,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站棱诱,受9級(jí)特大地震影響泼橘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迈勋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一炬灭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靡菇,春花似錦重归、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至泳唠,卻和暖如春狈网,著一層夾襖步出監(jiān)牢的瞬間宙搬,已是汗流浹背笨腥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勇垛,地道東北人脖母。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闲孤,于是被迫代替她去往敵國(guó)和親谆级。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烤礁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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