Java教程

【九月打卡】第3天【养成记】嵌入式挑战第3天,数据结构-线性表之单链表1

本文主要是介绍【九月打卡】第3天【养成记】嵌入式挑战第3天,数据结构-线性表之单链表1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.线性表的链式存储

顺序表由于逻辑上相邻的元素物理位置上也相邻,所以它的的插入、删除操作需要移动大量的元素,影响了运行效率,由此引入线性表的链式存储,它是通过“链”建立起元素之间的逻辑关系,对其进行插入、删除操作只需要修改指针。

2.单链表

1.单链表的定义

概述

线性表的链式存储又称为单链表,他是通过一组任意的存储单元来存储线性表中的数据元素。为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素的自身信息之外,还要存放一个指向其后继的指针。
图片描述
结点结构如上图,其中data为数据域,存放数据元素,next为指针域,存放其后继结点的指针。

图片描述
头结点:链表中第一个结点我们叫做头结点,数据域默认不使用,只是用指针域。
首结点:链表中头结点的下一个节点。空的带头结点的单链表没有首结点
尾结点:链表中最后一个结点我们叫做尾结点,尾结点的指针域为NULL。

单链表中节点类型描述
typedef struct LNode
{
    ElemType data;
    struct LNode *next;

} LinkNode, *LinkList;

2.单链表上基本操作的实现

1.创建

就是创建一个头结点,将next域设为空

LinkList CreateList()
{
    LinkList L = (LinkList)malloc(sizeof(LinkNode));
    L->next = NULL;
    return L;
}
2.插入(*)

插入统一的操作就是创建新结点病将值赋给新节点的data域

头插法

直接在头结点后面插入
图片描述

void InsertHeadList(LinkList L, ElemType e)
{
    LinkList p = L; //指向头结点
    LinkList temp = (LinkList)malloc(sizeof(LinkNode));
    temp->data = e;

    temp->next = p->next;
    p->next = temp;
}
尾插法

遍历链表直到尾结点(指针域为NULL),再后插
图片描述

void InsertTailList(LinkList L, ElemType e)
{
    LinkList p = L; //指向tou结点
    LinkList temp = (LinkList)malloc(sizeof(LinkNode));
    temp->data = e;
    while (p->next != NULL)
    {
        p = p->next;
    }
    temp->next = p->next;
    p->next = temp;
}
按序插入

下面代码是按照从大到小的顺序插入

void InsertOrderList(LinkList L, ElemType e)
{
    LinkList p = L; //指向tou结点
    LinkList temp = (LinkList)malloc(sizeof(LinkNode));
    temp->data = e;
    while (p->next != NULL && temp->data < p->next->data)
    {
        p = p->next;
    }
    temp->next = p->next;
    p->next = temp;
}
指定位置插入

找到第i-1位置 向后插入

int InsertList(LinkList L, int i, ElemType e)
{
    if (i <= 0)
        return 0;
    int j = 0;
    LinkList p = L, temp; //p指向tou结点

    while (p != NULL && j < i - 1)
    {
        j++;
        p = p->next;
    }
    if (NULL == p)
        return 0;
    else
    {
        temp = (LinkList)malloc(sizeof(LinkNode));
        temp->data = e;
        temp->next = p->next;
        p->next = temp;
        return 1;
    }
}
3.输出

从首结点开始扫描单链表,输出各节点data域值

void PrintList(LinkList L)
{
    LinkList p = L->next;
    while (p != NULL)
    {
        printf("%d", p->data);
        p = p->next;
    }
    printf("\n");
}
这篇关于【九月打卡】第3天【养成记】嵌入式挑战第3天,数据结构-线性表之单链表1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!