线性表的实现(C语言)

 小编使用的编译器CLion。如有问题可以私信小编,有不懂得也可以私信哦。

    初始化线性表

    遍历打印线性表

    销毁线性表

    清空线性表

    判断线性表是否为空

    求线性表长度

    获取指定位序元素

    线性表扩容

    表尾插入元素

    在指定元素前插入元素

    删除指定元素

    查找指定元素

    将在la中不在lb中的元素插入lb

    合并两个有序表


#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define LIST_INIT_SIZE 5

#define LIST_INCREMENT 5

typedef int ElemType;

typedef struct{

    ElemType *elem;  //存储基地址

    int listsize;

    int length;

}SqList;

/*初始化线性表*/

void InitList(SqList *L){

    L->elem =  (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //申请存储空间

    if(!L->elem)  //如果申请失败,退出,提示初始化失败

    {

        printf("初始化失败!\n");

        exit(-1);

    }

    L->length = 0; //

    L->listsize = LIST_INIT_SIZE;

    printf("初始化完成!\n");

}

/*打印列表所有元素*/

void ShowList(SqList *L)

{

    if(L->elem==NULL)

    {

        printf("当前线性表不存在!\n");

        exit(-1);

    }

    if(L->length==0)

    {

        printf("当前列表为空!\n");

        exit(-1);

    }

    for(int i=0;i<L->length;i++)

    {

        printf("%d-",L->elem[i]);

    }

    printf("\n");

}

/*销毁线性表*/

void DestroyList(SqList *L)

{

    L->elem = NULL;

    free(L->elem);

    printf("线性表销毁成功!\n");

}

/*清空线性表*/

void ClearList(SqList *L)

{

    L->length = 0;

    printf("线性表成功清空!\n");

}

/*线性表是否为空*/

int ListEmpty(SqList *L)

{

    if (L->length == 0)

    {

        return 1;

    }

    else

        return 0;

}

/*线性表长度*/

int ListLength(SqList *L)

{

    return L->length;

}

/*获取第i个元素*/

ElemType GetElem(SqList *L,int i)

{

    if(i>L->length-1){

        printf("您的输入超出界限!/n");

        return 0;

    }

    else {

      return L->elem[i];

    }

}

/*表满,额外,申请空间*/

void ListIncerment(SqList *L)

{

    ElemType *newbase;

    newbase = (ElemType *)realloc(L->elem, ((L->listsize+LIST_INCREMENT) * sizeof(ElemType)));

    if(!newbase){

        printf("扩容失败!/n");

        exit(-1);

    }

    L->elem = newbase;

    L->listsize += LIST_INCREMENT;

    printf("扩容成功!\n");

}

/*依次在表尾插入元素*/

void InputElem(SqList *L,ElemType e)

{

    if(L->length == L->listsize){

        ListIncerment(L);

    } //如果表满,申请扩容

    L->elem[L->length] = e;

    L->length +=1;

    printf("插入元素-%d-成功!\n",e);

}

/*在位置i之前插入元素e*/

void ListInsert(SqList *L,int i,ElemType e)

{

    if(i<1||i>L->length){

        printf("当前共有%d个元素,请输入1-%d之间的数字!\n",L->length,L->length);

        exit(-1);

    }

    if(L->length==L->listsize)

    {

        ListIncerment(L);

    }

    for(int n=L->length-1;n>i-2;n--)

    {

        L->elem[n+1] = L->elem[n];

    }

    L->elem[i-1] = e;

    L->length++;

    printf("插入成功!\n");

}

/*删除i位置的元素,并用e返回*/

void DeleteElem(SqList *L,int i,ElemType* e)

{

    if(i<1||i>L->length)

    {

        printf("输入有误! 请输入1-%d之间的数字!\n",L->length);

        exit(-1);

    }

    *e = L->elem[i-1];

    for(int n=i;n<L->length;n++)

    {

        L->elem[n-1] = L->elem[n];

    }

    L->length --;

    printf("删除成功!\n");

}

/*查找是否存在某元素。存在,打印位序;不存在,提示并退出。*/

int LocateElem(SqList *L,ElemType e)

{

    int n;

    for(int i=0;i<L->length;i++)

    {

        if(L->elem[i]==e)

        {

            n = i;

            return 1;

        }

    }

    printf("该元素不存在\n");

    return 0;

}

/*将所有在la中但不在lb中的元素插入到lb中*/

void Union(SqList *la,SqList *lb)

{

    for(int i=0;i<la->length;i++)

    {

        if(!LocateElem(lb,la->elem[i]))

        {

            InputElem(lb,la->elem[i]);

        }

        else

        {

            continue;

        }

    }

}

/*两个有序表的合并,由lc返回*/

void MergeList(SqList *la,SqList *lb,SqList *lc)

{

    int i = 0;

    int j = 0;

    ElemType a,b;

    //当a,b均不为空时,合并一部分数据

    while(i<la->length && j<lb->length)

    {

        a = GetElem(la,i);

        b = GetElem(lb,j);

        if(a<b)

        {

            InputElem(lc,a);

            i++;

        }

        else

        {

            InputElem(lc,b);

            j++;

        }

    }

    //当a不为空时

    while(i<la->length)

    {

        InputElem(lc,la->elem[i]);

        i++;

    }

    //当b不为空时

    while (j<lb->length)

    {

        InputElem(lc,lb->elem[j]);

        j++;

    }

    printf("合并完成!\n");

}

int main() {

    return 0;

}

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

推荐阅读更多精彩内容