线性表知识点学习笔记

最近刷题刷的太混乱了,决定先过一遍知识点,再刷一下题,链表的题之前刷过一部分,打算之后就先学习,然后刷题,最后总结。

  1. 线性表的元素之间是有序的。

  2. 第一个元素无前驱,最后一个元素无后继,每个元素只有一个前驱,一个后继。

  3. 线性表的个数是有限的。数据类型是相同的

  4. 线性表:可以根据位数得到元素或者查找某个元素存在与否,获得线性表的长度。

  5. 线性表的两种物理结构:顺序存储结构 ,链式存储结构
    5.1 顺序存储结构:
    1 用一串地址连续的存储单元依次存储线性表的数据。也可以用一维数组来实现。分配的数组空间要大于线性表的长度。
    2 进行插入和删除操作时,注意先判断线性表是满的还是空的。然后看插入的位置在不在有效范围内。
    读取数据,时间复杂度O(1); 插入删除时,时间复杂度O(n)。
    5.2 链式存储结构:元素存储不只有元素信息,还要后继元素位置信息。
    1 头指针与头结点
    头指针是整个链表的必要元素,是链表指向第一个结点的指针,常以头指针冠以链表的名字,不论链表是否为空,头指针均不为空。
    头结点不一定是整个链表的必要元素,它放在第一元素结点之前,它的数据域一般是没有意义的;
    2 线性表为空,头结点指针域为空。

  6. 单链表的读取
    先定义一个结构体:
    struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
    };
    可以声明一个指针指向链表的第一个结点。
    ListNode *p=head->next;

  7. 单链表工作核心 工作指针后移 不方便用for控制循环。L
    单链表主要用来执行插入和删除操作。
    单结点的插入:创建新结点 s ,插入操作:s->next=p->next; p->next=s;
    单结点的删除:创建新结点q ,删除操作:q=p->next; p->next=q->next; free(q);

  8. 静态链表:
    用数组代替指针来描述链表。
    要事先分配一个比较大的空间,防止溢出。
    struct{
    elemtype data;
    int cur;
    }
    数组的第一个元素和最后一个元素不存数据(备用链表),第一个元素的cur放备用链表第一个结点下标;最后一个元素的cur放第一个插入元素的下标,相当于头结点。

若链表为空,则最后一个元素的cur为0。\

静态链表的插入和删除:
插入:
链表存储结构分配,需要时申请,无用时释放。
动态链表中,申请和释放 malloc(), free();
静态链表操作的是数组。把没用过的分量和已经被删除的分量链成一个备用链表,每次插入的时候,从备用链表取一个结点作为待插入的新结点。

拿出来一个空闲分量:
int i = space[0].cur;
if(space[0].cur){
space[0].cur=space[i].cur;//space[i]的cur是下一个空闲位置的地址
}

静态链表L中,在第i个位置插入:
注意找到第i个位置,是从最后一个元素的cur开始。j是返回的空闲分量位置。
k = MAX_SIZE-1;
for(int m=1;m<=i-1;m++){
k=L(k).cur;
}
L(j).cur=L(k).cur;
L[k].cur=j;

删除:
for(int m=1;m<=i-1;m++){
k=L(k).cur;
}
m=L(k).cur;
L(k).cur=L(m).cur;

要释放内存,也就是把删掉的这个放到备用链表里的第一个;
space[m].cur=space[0].cur;
space[0].cur=m;

  1. 循环链表
    将单链表中的终端结点的空指针改成指向头结点,就变成了循环链表。
    原本单链表的循环判断条件是p->next==NULL?
    也可以在末尾放一个尾指针,头结点就是rear->next->next;
    合并两个循环链表时,头尾相接,然后要释放掉一个头结点。
    p=rearA->next;
    rearA->next=rearB->nexr->next;
    q=rearB-next;
    rearB->next=p;
    free(q);

  2. 双向链表
    在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
    后继的前驱=前驱的后继=自己 p->next->prior=p->prior->next=p;

在插入和删除时,要改变两个指针:
插入:
要把s插到p和p->next中:
s->prior=p;
s->next=p->next;//先搞定s的前驱和后继
p->next->prior=s;//再搞定p->next的前驱
p->next=s;//最后再搞定p的后继。

删除:
p->prior->next=p->next;
p-next->prior=p->prior;
free§;

基本知识点结束。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值