順序表基本算法

順序表:
即線性表的順序存儲結構, 其邏輯結構與物理存儲結構一致.內存分配連續(xù),需要考慮初始內存分配和內存追加的問題.

基礎算法:

1.類型定義&宏定義

#define C_TRUE 0
#define C_FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 // 線性表存儲空間的初始分配量
#define LISTINCREMENT 10 // 線性表存儲空間的分配增量
typedef struct
{
    int *elem; // 首地址指針
    int length; // 長度
    int listsize; // 當前分配的存儲容量
}List;

2.創(chuàng)建空表

int ListInit(List *L) {
    L->elem = (int *)malloc(LIST_INIT_SIZE *sizeof(int));
    if (NULL == L->elem) exit(OVERFLOW);
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    return OK;
}

3.追加元素

int ListAdd(List *L, int e) {
    if (L->length >= L->listsize) {
        int *newbase = (int *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(int));
        if (!newbase) exit(OVERFLOW);
        L->elem = newbase;
        L->listsize += LISTINCREMENT;
    }
    L->elem[L->length] = e;
    L->length++;
    return OK;
}

4.插入元素

// 在第i個元素之前插入一個元素elem
int ListInsert(List *L, int i, int e) {
    // 保證i合法, i可以插到最后一個元素后面, 假定插入最后一個元素后面一個元素前面
    if (i<1 || i>L->length + 1) {
        printf("位置不合法");
        return ERROR;
    }
    
    if (L->length >= L->listsize) // 存儲空間滿, 增加分配
    {
        /* code */
        int *newbase = (int *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(int));
        if (!newbase) exit(OVERFLOW); // OVERFLOW 內存溢出
        L->elem = newbase; // 新基址
        L->listsize += LISTINCREMENT;
    }
   
    // 插入的位置, 這里的位置不是數(shù)組元素下標, 而是實際物理地址,也可以用下標實現(xiàn) 
    int *q = &(L->elem[i - 1]);
    for (int *p = &(L->elem[L->length - 1]); p >= q; --p) {
        *(p + 1) = *p;
    }
    *q = e;
    L->length++;
    return OK;
}

5.遍歷

void ListTraversal(List L) {
    for (int i = 0; i<L.length; i++) {
        printf("長度為:%d, 下標為%d的元素: %d\n", L.length ,i,L.elem[i]);
    }
}

6.刪除

int ListDelete(List * L, int pos) {
    if (pos<0 || pos>L->length-1) {
        printf("刪除位置不合法\n");
        return ERROR;
    }
    int *q = L->elem + pos;
    int *p = L->elem + L->length - 1;
    for (++q; q<=p; ++q) *(q-1) = *q;
    --L->length;
    return OK;
}

7.取元素

// 取出第 i 個元素并賦值給*pE;
int ListGeteElem(List p, int i, int *pE) {
    if (i<1 || i>p.length) {
        printf("取元素位置不合法\n");
        return ERROR;
    }
    *pE = p.elem[i-1];
    printf("第%d個元素為: %d\n", i,*pE);
    return OK;
}

8.判斷是否為空

int ListIsEmpty(List L) {
    if (L.length==0) {
        printf("表為空\n");
        return C_TRUE;
    } else {
        printf("表不為空\n");
        return C_FALSE;
    }
}

9.歸并

// La Lb 都是遞增的, 歸并后 pC 也需要遞增
void ListMerge(List La, List Lb, List *pC) {
    ListInit(pC);
    int i, j;
    i = j = 1;
    int ai;
    int bj;
    while (i<=La.length && j<=Lb.length) { // 保證都不越界
        ListGeteElem(La, i, &ai); ListGeteElem(Lb, j, &bj);
        if (ai < bj) {
            ListAdd(pC, ai); // 如果ai小, 把ai放進pC, j不能加, 繼續(xù)與ai+1比較
            i++;
        } else {
            ListAdd(pC, bj); // 同理
            j++;
        }
    }
    while (i<=La.length) {
        ListGeteElem(La, i++, &ai);
        ListAdd(pC,ai);
    }
    while (i<=Lb.length) {
        ListGeteElem(Lb, i++, &ai);
        ListAdd(pC,ai);
    }
}

總結:
學習數(shù)據結構和算法的過程考慮到內存溢出, 數(shù)組越界等問題訓練程序員所寫代碼的健壯性, 對比一些其他語言, C是直接操作內存的, 有些語言如OC在內存分配失敗(即alloc失敗)時一般不做任何處理, 雖然失敗的概率很小, 但就代碼的嚴謹性來說C語言更勝一籌.

在學習過程中, 值得注意的兩點, 一是什么時候參數(shù)傳遞指針, 什么時候直接傳值, 我的總結是: 使用時傳值, 修改時傳遞指針; 因為使用是使用值, 而改變則需要知道修改哪塊內存對應的值.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容

  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,736評論 24 1,002
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,720評論 0 11
  • 愛情是什么樣子,似乎一直都不是我想象的樣子。就像我走近你很遠,因為你不了解我;但你走近我很近,因為我了解你。 一 ...
    三言兩二拍閱讀 795評論 2 0
  • 剛在看到簡書一篇文章叫做《畢業(yè)以后,我們過著死魚一樣的生活》。我沒有點開看,我能想象到內容是什么。只是這個...
    顰眉閱讀 237評論 0 0
  • 認識的人越少越好 不要沾染不適合自己的圈子 知己那么一兩個就足夠 沉住氣 別去巴結誰 別人的奇跡和你無關 得不到的...
    泡泡糖味的小果凍閱讀 417評論 0 1