順序表(數(shù)據(jù)結(jié)構(gòu))


本篇文章主要針對(duì)《數(shù)據(jù)結(jié)構(gòu)》中的順序表的增刪查改以及一些常用算法進(jìn)行詳盡的代碼描述。本代碼使用c語言書寫敌蚜,并且通過測(cè)試桥滨。可以直接拷貝編譯钝侠,在你的main函數(shù)中進(jìn)行測(cè)試该园。

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50  //順序表的表長(zhǎng)
#define InitSize 100 //順序表的初始表長(zhǎng)

typedef struct {
    int data[MaxSize];  //順序表的元素
    int length;         //順序表的長(zhǎng)度
}SqList;              //順序表的類型定義

typedef struct{
    int *data;          //指示動(dòng)態(tài)分配的數(shù)組指針
    int dataSize,length; //數(shù)組的最大容量和當(dāng)前儲(chǔ)存元素的個(gè)數(shù)
}mSqList;

/*
 * [InitList 順序表初始化函數(shù)]
 * @param  L [傳入需要初始化的順序表]
 * @return   [成功初始化返回 1]
 */
int InitList(mSqList *L,int size){
    for (int i = 0; i < size; i++) {
        L->data[i] = rand()%1000;
    }
    L->dataSize = InitSize;
    L->length = size;
    return 1;
}

/**
 * [Length 計(jì)算表長(zhǎng)]
 * @param  L [傳入需要計(jì)算長(zhǎng)度的順序表]
 * @return   [返回表長(zhǎng)]
 */
int Length(mSqList L){
    return L.length;
}

/**
 * [LocateElem 查找元素e所在的位置]
 * @param  L [傳入需要查找的順序表]
 * @param  e [需要查找的元素e]
 * @return   [成功查找返回元素的位置,查找失敗返回-1]
 */
int LocateElem(mSqList L,int e){
    for(int i = 0; i < L.length; i++)
    {
        if(L.data[i] == e)
        {
            return i+1;
        }
    }
    return -1;
}

/**
 * [GetElem 按位置查找元素]
 * @param  L        [傳入需要查找的順序表]
 * @param  position [傳入需要查找的位置position]
 * @return          [查找成功返回查找元素帅韧,查找失敗返回-1]
 */
int GetElem(mSqList L,int position){
    if (position <= 0 || position > L.length)
    {
        return -1;
    }
    return L.data[position - 1];
}

/**
 * [ListInsert 向線性表對(duì)應(yīng)位置i插入元素e]
 * @param  L [需要插入的順序表]
 * @param  i [元素插入的位置]
 * @param  e [插入的元素]
 * @return   [成功返回 1里初,插入失敗返回-1]
 */
int ListInsert(mSqList *L,int i,int e){
    if (i < 1 | i > L->length + 1)
    {
        return -1;
    }
    if (L->length >= L->dataSize)
    {
        return -1;
    }
    for (int j = L->length; j >= i; j--)
    {
        L->data[j] = L->data[j-1];
    }
    L->data[i-1] = e;
    L->length++;
    return 1;
}

/**
 * [ListDelete 刪除順序表中位置i的元素]
 * @param  L [待刪除的順序表]
 * @param  i [待刪除元素的位置]
 * @return   [成功返回刪除元素的值 e,失敗返回 -1]
 */

int ListDelete(mSqList *L,int i)
{
    int e = 0;
    if (i < 1 || i > L->length)
    {
        return -1;
    }
    e = L->data[i-1];
    for (int j = i; j < L->length; j++)
    {
        L->data[j-1] = L->data[j];
    }
    L->length--;
    return e;
}

/**
 * [ListMinDelete 刪除順序表中最小的元素]
 * @param  L [待刪除的順序表]
 * @return   [成功返回刪除的元素 e忽舟,失敗返回 -1]
 */
int ListMinDelete(mSqList *L)
{
    int tmp = L->data[0];
    int position = 0;
    if(L->length < 1)
    {
        return -1;
    }
    for (int i = 0; i < L->length; i++)
    {
        if(tmp > L->data[i])
        {
            tmp = L->data[i];
            position = i;
        }
    }
    L->data[position] = L->data[L->length-1];
    L->length--;
    return tmp;
}

/**
 * [ListReverse 將順序表原地逆置]
 * @param  L [需要逆置的順序表]
 * @return   [成功返回 1双妨,失敗返回 -1]
 */
int ListReverse(mSqList *L)
{
    int tmp = 0;
    if(L->length <= 0)
    {
        return -1;
    }
    for(int i = 0; i < L->length / 2; i++)
    {
        tmp = L->data[i];
        L->data[i] = L->data[L->length - i - 1];
        L->data[L->length - i - 1] = tmp;
    }
    return 1;
}

/**
 * [ListElemDelete 刪除順序表中所有相同的元素]
 * @param  L [待刪除的順序表]
 * @param  x [待刪除的元素 x]
 * @return   [成功刪除反回刪除后順序表的長(zhǎng)度 length,失敗則返回 -1]
 */

int ListElemDelete(mSqList *L,int x)
{
    int k = 0;
    int delNUm = 0;
    if(L->length <= 0)
    {
        return -1;
    }
    for (int i = 0; i < L->length; i++)
    {
        if(L->data[i] != x)
        {
            L->data[k] = L->data[i];
            k++;
        }
    }
    delNUm = L->length - k;
    L->length = k;
    return delNUm;
}

/**
 * [ListRangeDelete 刪除順序表中在start 和 stop 范圍內(nèi)的 元素]
 * @param  L     [待刪除的順序表]
 * @param  start [刪除值范圍的最小值]
 * @param  stop  [刪除值范圍的最大值]
 * @return       [成功返回以刪除的元素個(gè)數(shù)叮阅,失敗返回-1]
 */
int ListRangeDelete(mSqList *L,int start,int stop)
{
    int k = 0;
    int delNUm = 0;
    if (start > stop)
    {
        return -1;
    }
    if (L->length <= 0)
    {
        return -1;
    }
    for (int i = 0; i < L->length; i++)
    {
        if(L->data[i] < start || L->data[i] > stop)
        {
            L->data[k] = L->data[i];
            k++;
        }
    }
    delNUm = L->length - k;
    L->length = k;
    return delNUm;
}

/**
 * [ListDumpDelete 刪除有序的順序表中含重復(fù)元素的項(xiàng)]
 * @param  L [待刪除的有序順序表]
 * @return   [成功返回刪除返回刪除元素個(gè)數(shù)刁品,失敗返回 -1]
 */
int ListDumpDelete(mSqList *L)
{
    int k = 0;
    int len = 0;
    if(L->length <=0 )
    {
        return -1;
    }
    for (int i = 1; i < L->length; i++)
    {
        if (L->data[k] != L->data[i])
        {
            L->data[++k] = L->data[j];
        }
    }
    len = L->length - k - 1;
    L->length = k + 1;
    return len;
}

/**
 * [ListBindSorted 將兩個(gè)有序表進(jìn)行合并,并且將合并后的有序表返回]
 * @param  L1 [待合并的有序表L1]
 * @param  L2 [待合并的有序表L2]
 * @param  L3 [合并后的有序表L3]
 * @return    [成功返回 1浩姥,失敗返回 -1]
 */
int ListBindSorted(mSqList *L1, mSqList *L2, mSqList *L3)
{
    if (L1->length + L2->length > L3->dataSize)
    {
        return -1;
    }
    int i = 0;
    int j = 0;
    int k = 0;
    while(i < L1->Length && j < L2->length)
    {
        if (L1->data[i] < L2->data[j])
        {
            L3->data[k++] = L1->data[i++];
        }else {
            L3->data[k++] = L2->data[j++];
        }
    }
    while(i < L1->length)
    {
        L3->data[k++] = L1->data[i++];
    }
    while(j < L2->length)
    {
        L3->data[k++] = L2->data[j++];
    }
    L3->length = k;
    return 1;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挑随,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勒叠,更是在濱河造成了極大的恐慌兜挨,老刑警劉巖膏孟,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拌汇,居然都是意外死亡柒桑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門噪舀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魁淳,“玉大人,你說我怎么就攤上這事与倡〗绻洌” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蒸走,是天一觀的道長(zhǎng)仇奶。 經(jīng)常有香客問我,道長(zhǎng)比驻,這世上最難降的妖魔是什么该溯? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮别惦,結(jié)果婚禮上狈茉,老公的妹妹穿的比我還像新娘。我一直安慰自己掸掸,他們只是感情好氯庆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扰付,像睡著了一般堤撵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羽莺,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天实昨,我揣著相機(jī)與錄音,去河邊找鬼盐固。 笑死荒给,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刁卜。 我是一名探鬼主播志电,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛔趴!你這毒婦竟也來了挑辆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎之拨,沒想到半個(gè)月后茉继,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚀乔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菲茬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吉挣。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖婉弹,靈堂內(nèi)的尸體忽然破棺而出睬魂,到底是詐尸還是另有隱情,我是刑警寧澤镀赌,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布氯哮,位于F島的核電站,受9級(jí)特大地震影響商佛,放射性物質(zhì)發(fā)生泄漏喉钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一良姆、第九天 我趴在偏房一處隱蔽的房頂上張望肠虽。 院中可真熱鬧,春花似錦玛追、人聲如沸税课。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)韩玩。三九已至,卻和暖如春陆馁,著一層夾襖步出監(jiān)牢的瞬間找颓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工氮惯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叮雳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓妇汗,卻偏偏與公主長(zhǎng)得像帘不,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杨箭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評(píng)論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法寞焙,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法捣郊,異常的語法辽狈,線程的語...
    子非魚_t_閱讀 31,622評(píng)論 18 399
  • 姓名:張麗娟 公司:個(gè)體 【日精進(jìn)打卡第33天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》1遍,共60遍 《大學(xué)》1遍呛牲,共49遍...
    兌了水的悲傷閱讀 159評(píng)論 0 1
  • 往前走一步刮萌,走一步,走一步娘扩,再走一步 你就會(huì)看見那個(gè)蜷縮在墻角的女孩 她那么無助的在等你 等你 等你…
    你從南方來閱讀 217評(píng)論 0 0