数据结构重点知识点复习——第二章 线性表(链表)

目录

一、线性表的链式存储结构

​编辑

二、单链表

1头插法

2尾插法

3按序号查找

4按值查找

5插入

6删除

三、双链表

1定义

2插入

3删除

四、循环与静态链表

1循环链表

1循环单链表:

2循环双链表:

3应用场景:

2静态链表

应用场景;


一、线性表的链式存储结构

cpp 复制代码
typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;

二、单链表

1头插法

建立新的结点分配内存空间,将新结点插入到当前链表的表头

cpp 复制代码
Linklist Creatlist1(Linklist &L){
    LNode *s;  //辅助指针
    int x;
    L=(Linklist)malloc(sizeof(LNode));   //创建头结点
    L->next=NULL; //空表
    scanf("%d",&x);  //输入节点的值
    while(X!=9999){
        s=(LNode*)malloc(sizeof(LNode));   //创建头结点
        s->data=x;
        s->next=L->next;
        L->next=s;   
        scanf("%d",&x);  //输入节点的值
    }
    return L;
}

2尾插法

建立新的结点分配内存空间,将新结点插入到当前链表的表尾

cpp 复制代码
Linklist Createlist2(Linklist &L){
    int x;
    L=(Linklist)malloc(sizeof(LNode));
    LNode *s,*r=L;  //r为表尾指针
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;  //尾指针置空
    return L;
}

3按序号查找

在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL

cpp 复制代码
LNode *Getelem(Linklist L,int i){
    int j=1;   //计数用的
    LNode *p=L->next;  //第一个节点赋值给p
    if(i==0)
        return L;   //若i=0返回头结点
    if(i<1)
        return NULL;  //若i无效,返回NULL
    while(p&&j<i){   //查找节点
        p=p->next;
        j++;
    }
    return p;  //如果大于表长,直接返回p 
}

4按值查找

从单链表第一个结点开始,由前往后依次比较表中各结点数据域的值,若某结点数据域的值等于给定值e,则返回该结点的指针;若整个单链表中没有这样的结点,则返回NULL。

cpp 复制代码
LNode *Locateelem(Linklist L,Elemtype e){
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e)
        p=p->next;
    reurn p;
}

5插入

插入操作是将值为x的新结点插入到单链表的第i个位置上。先检查插入位置的合法性,然后找到待插入位置的前驱结点,即第i−1个结点,再在其后插入新结点。

算法思路:

1.取指向插入位置的前驱结点的指针 ① p=GetElem(L,i-1);

2.令新结点*s的指针域指向*p的后继结点 ② s->next=p->next;

3.令结点*p的指针域指向新插入的结点*s ③ p->next=s;

6删除

删除操作是将单链表的第i个结点删除。先检查删除位置的合法性,然后查找表中第i−1个结点,即被删结点的前驱结点,再将其删除。

算法思路:

1.取指向删除位置的前驱结点的指针 p=GetElem(L,i-1);

2.取指向删除位置的指针 q=p->next;

3.p指向结点的后继指向被删除结点的后继 p->next=q->next

4.释放删除结点 free(q);

三、双链表

1定义

cpp 复制代码
//单链表节点类型
typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*Linklist;
//双链表节点类型
typedef struct DNode{
    Elemtype data;
    struct LNode *prior,*next;
}DNode,*DLinklist;

2插入

插入:(方法不唯一)

① s->next=p->next;

② p->next->prior=s;

③ s->prior=p;

④ p->next=s;

3删除

删除:

① p->next=q->next;

② q->next->prior=p;

③ free(q);

四、循环与静态链表

1循环链表

1循环单链表:

循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环

带头节点判空:p→next=head

2循环双链表:

类比循环单链表,循环双链表链表区别于双链表就是首尾结点构成环

当循环双链表为空表时,其头结点的prior域和next域都等于Head。p→prior==head&&p→next==head

3应用场景:

约瑟夫问题、拉丁方阵问题

2静态链表

静态链表:静态链表是用数组来描述线性表的链式存储结构。

数组第一个元素不存储数据,它的指针域存储第一个元素所在的数组下标。链表最后一个元素的指针域值为-1。

应用场景;

1.不支持指针的低级语言

2.数据元素数据固定不变的场景(如操作系统的文件分配表FAT)

相关推荐
lulu_gh_yu8 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>2 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
XuanRanDev3 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
代码猪猪傻瓜coding3 小时前
力扣1 两数之和
数据结构·算法·leetcode
南宫生4 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
weixin_432702265 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
passer__jw7676 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
爱吃生蚝的于勒6 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~7 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
脉牛杂德7 小时前
多项式加法——C语言
数据结构·c++·算法