数据结构---线性表

参照<<大话数据结构>> 仅做学习记录

  • 线性表

顺序存储结构

一维数组,内存是连续挨着的

基本的增删查改

/*
InitList(*L): 初始化操作,建立一个空的线性表L。
ListEmpty(L): 若线性表为空,返回true,否则返回false。
ClearList(*L): 将线性表清空。
GetElem(L, i, *e): 将线性表L中的第 i 个位置元素值返回给e。
InsertElem(L, i, *e): 将线性表L中的第 i 个位置元素设置为e
LocateElme(L, e): 在线性表L中查找与给定值e相等的元素,
*/
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
#define MAXSIZE 5

typedef int Element;
typedef struct 
{
    Element data[MAXSIZE];
    int length;
} SqList;

void InitList(SqList* L) {
    L->length = 0;
    memset(L->data,0x00,MAXSIZE* sizeof(Element));
    printf("InitList\n");
}

int ListEmpty(SqList* L) {
    if (L->length == 0) {
        printf("ListEmpty %d\n", 0);
        return 0;
    } else {
        printf("ListEmpty %d\n", L->length);
        return L->length;
    }
}

void ClearList(SqList* L) {
    L->length = 0;
    memset(L->data, 0, sizeof(Element)*MAXSIZE);
}

void GetElem(SqList* L, int i, Element* e) {
    memcpy(e, L->data+i, sizeof(Element));
    printf("GetElem %d val = %d\n", i, *e);
}

int LocateElme(SqList* L, Element* e) {
    Element* tmp = L->data;
    int val = -1;
    for (int i = 0; i < sizeof(L); i++) {
        if (*e == tmp[i]) {
            val = i;
            break;
        }
    }
    printf("LocateElme pos = %d\n", val);
    return val;
}
// i :0-(MAXSIZE-1)
int InsertElem(SqList* L, int i, Element e) {
    if (i < 0 || i > MAXSIZE) {
        return -1;
    }
    // 是否已有数据
    memcpy(L->data+i, &e, sizeof(Element));
    L->length++;
    return 0;
}

int DelectElem(SqList* L, int i) {
    if (i < 0 || i > MAXSIZE) {
        return -1;
    }
    memset(L->data+i, 0x00, sizeof(Element));
    L->length--;
    return 0;
}

void prinfList(SqList* L) {
    for (int i = 0; i< MAXSIZE; i++) {
        printf("data[%d] = %d ,", i, L->data[i]);
    }
    printf("\n");
}

int main() {
    SqList Ltmp;
    Element Etmp = 200;

    InitList(&Ltmp);
    InsertElem(&Ltmp, 0, (Element)(100));
    InsertElem(&Ltmp, 1, (Element)(200));

    prinfList(&Ltmp);

    LocateElme(&Ltmp, &Etmp);
    ListEmpty(&Ltmp);
    GetElem(&Ltmp, 0, &Etmp);
    DelectElem(&Ltmp, 1);

}

缺点:删除和插入非常耗时低效

链式存储结构

结点 = 数据域 + 指针域,n个结点组合起来的称为链表

由于指针域只有一个指针,故称之为单链表

线性链表:第一个结点的指针域称为头指针, 最后一个节点为NULL

单链表

头插法---尾插法

静态链表:用数组描述的链表叫做静态链表

结构体 {

    数据域;

    游标:代表下一个数据的位置;

} 数组

插入/删除数据:可以不改动之前的数据即可插入,删除数据。

循环链表:默认尾节点的指针是空,把尾结点的指针指向头结点,即可形成循环链表

双向链表:为了克服单链表的单向循环查找,如果需要查找上个结点,需要再转一圈,所以相较单链表,在指针域在加了一个指针,指向上一个结点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值