顺序表基本算法

顺序表:
即线性表的顺序存储结构, 其逻辑结构与物理存储结构一致.内存分配连续,需要考虑初始内存分配和内存追加的问题.

基础算法:

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.创建空表

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;
    }
   
    // 插入的位置, 这里的位置不是数组元素下标, 而是实际物理地址,也可以用下标实现 
    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不能加, 继续与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);
    }
}

总结:
学习数据结构和算法的过程考虑到内存溢出, 数组越界等问题训练程序员所写代码的健壮性, 对比一些其他语言, C是直接操作内存的, 有些语言如OC在内存分配失败(即alloc失败)时一般不做任何处理, 虽然失败的概率很小, 但就代码的严谨性来说C语言更胜一筹.

在学习过程中, 值得注意的两点, 一是什么时候参数传递指针, 什么时候直接传值, 我的总结是: 使用时传值, 修改时传递指针; 因为使用是使用值, 而改变则需要知道修改哪块内存对应的值.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,624评论 24 1,002
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,681评论 0 11
  • 爱情是什么样子,似乎一直都不是我想象的样子。就像我走近你很远,因为你不了解我;但你走近我很近,因为我了解你。 一 ...
    三言两二拍阅读 755评论 2 0
  • 刚在看到简书一篇文章叫做《毕业以后,我们过着死鱼一样的生活》。我没有点开看,我能想象到内容是什么。只是这个...
    颦眉阅读 232评论 0 0
  • 认识的人越少越好 不要沾染不适合自己的圈子 知己那么一两个就足够 沉住气 别去巴结谁 别人的奇迹和你无关 得不到的...
    泡泡糖味的小果冻阅读 396评论 0 1