线性表

一、顺序表

顺序表的定义

  • 初始化顺序表
//基本操作-初始化一个顺序表
void InitList(SqList &L){
    for(int i=0;i<MaxSize;i++)
        L.data[i] = 0;   //将所有数据元素设置为默认初始值
    L.length = 0; //顺序表初始长度为0
}
  • 如果去掉默认值的设置的步骤,则会出现“脏数据”的现象(内存中遗留的)正常情况下把各个数据元素的值设为默认值
  • 将length设置为0不可省略

顺序表的实现(动态分配)

//初始化
void InitList(SeqList &L){
    //使用malloc函数申请一片连续的存储空间
    L.data = (int *)malloc(InitSize * sizeof(int));
    L.length = 0;
    L.MaxSize = InitSize;
}
//增加动态数据的长度
void IncreaseSize(SeqList &L,int len){
    int *p = L.data;
    L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));
    for(int i=0;i<L.length;i++){
        L.data[i] = p[i];  //将数据复制到新区域
    L.MaxSize = L.MaxSize + len;  //顺序表最大长度增加len
    free(p);    //释放原来的内存空间
}

realloc函数也可实现

顺序表的查找

顺序表的查找有两种方式:

  • 按位查找
  • 按值查找
    代码:
//按位查找
ElemType GetElem(SeqList L;int i){
    return L.data[i-1];
}

二、链表

单链表的初始化

单链表的建立

  • 尾插法
  • 头插法

对应代码

  • 尾插法
LinkList List_TailInsert(LinkList &L){  //正向建立单链表
    int x; //设置ElemType为整型
    L = (LinkList)malloc(sizeof(LNode)); //建立头节点
    LNode *s, *r=L;   //r为表尾指针
    scanf("%d",&x);
    while(x!=9999){  //输入9999表示结束
        s = (LNode *)malloc(sizeof(LNode))
        s->data = x;
        r->next = s;
        r = s;                  //r指向新的表尾结点
        scanf("%d",&x);
    }
    r->next = NULL;  //尾结点指针置空
    return L;
}
  • 头插法
LinkList List_HeadInsert(LinkList &L){  //逆向建立单链表
    LNode *s;
    int x;
    L = (LinkList)malloc(sizeof(LNode)); //建立头节点
    L->next = NULL; //初始为空链表
    scanf("%d",&x);   //输入节点的值
    while(x!=9999){  //输入9999表示结束
        s = (LNode *)malloc(sizeof(LNode)) //创建新结点
        s->data = x; 
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    }
    return L;
}

双链表

双链表的初始化

//结点 double node
typedef struct DNode{   //定义双链表结点类型
    ElemType data;      //数据域
    struct DNode *prior, *next;    //前驱和后继指针
}DNode, *DLinkList;

//初始化双链表(带头结点)
bool InitDLinkList(DLinkList &L){
    L = (DNode *)malloc(sizeof(DNode));   ///分配一个头结点
    if (L==NULL)
        return false;
    L->prior = NULL;    //头结点的prior永远指向NULL
    L->next = NULL;    //头结点之后暂时还没有结点
    return true;
}

双链表的插入

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