数据结构复习笔记(二)——线性表的链式存储结构之单链表

顺序存储结构的不足

在插入和删除过程中,需要移动大量的元素,极其耗时。

链式存储结构

数据元素需存储:

  • 数据元素信息
  • 指向后继元素的存储地址

单链表

每个节点只包含一个指针

  • 头指针: 第一个节点存储位置
  • 头节点:第一个节点前的节点,存储头指针

链式存储结构代码表示

#define ElemType int

typedef struct Node {
    ElemType data;
    struct Node *next;
} Node;

typedef struct Node *LinkList;

单链表的创建

头插法

数据结构复习笔记(二)——线性表的链式存储结构之单链表_第1张图片
头插法
//头插法
void CreatLinkList_H(LinkList *L, int n) {
    int i;
    LinkList p;
    
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL; //头结点

    for (i = 0; i < n; i++) {
        p = (LinkList)malloc(sizeof(Node));//开辟空间
        
        cin >> p->data;//输入

        p->next = (*L)->next;//头插
        (*L) -> next = p;
    }
    cout << "单链表创建成功!" << endl;
}

尾插法

void CreatLinkList_T(LinkList *L, int n) {
    int i;
    LinkList p;
    LinkList r;
    
    (*L) = (LinkList)malloc(sizeof(Node));
    
    for (i = 0; i < n; i++) 
    {
        r = *L;
        p = (LinkList)malloc(sizeof(Node));
        cin >> p->data;
        r->next = p;
        r = p;
        
    }
    r->next = NULL;
    cout << "单链表创建成功!" << endl;

}
数据结构复习笔记(二)——线性表的链式存储结构之单链表_第2张图片
尾插法.png

单链表的读取

ElemType GetElem(LinkList L, int i, ElemType *e) {
    
    LinkList p;
    p = L->next;
    int j = 1;

    for (j = 1; j < i; j++)
    {
        p = p->next;

    }
    if (!p || j > i)
    {
        exit(0);
    }
    *e = p->data;
    return *e;
}
数据结构复习笔记(二)——线性表的链式存储结构之单链表_第3张图片
获得元素

单链表得插入与删除

插入

数据结构复习笔记(二)——线性表的链式存储结构之单链表_第4张图片
插入1

数据结构复习笔记(二)——线性表的链式存储结构之单链表_第5张图片
插入2

无需移动元素,只需要将p得后继指向s,s的后继指向p->next

//插入
LinkList insert(LinkList *L, int i, ElemType e) {
    LinkList s;
    LinkList p;
    p = *L; //指针p指向头结点

    int j = 1;
    while (p && j < i)
    {   
        p = p->next;//向后移动指针直到i位置
        j++;
    }

    //若i结点不存在
    if (!p || j>i)
    {
        exit(0); 
    }
    
    s = (LinkList)malloc(sizeof(Node)); //初始化s
    s->data = e;

    s->next = p->next;
    p->next = s;

    return *L;
}
数据结构复习笔记(二)——线性表的链式存储结构之单链表_第6张图片
插入

删除

删除与插入同理,只需将p的后继指向s->next即可


数据结构复习笔记(二)——线性表的链式存储结构之单链表_第7张图片
删除
LinkList LinkListDelete(LinkList *L, int i, ElemType *e) {
    LinkList s;
    LinkList p;
    p = *L; //指针p指向头结点

    int j = 1;
    while (p && j < i)
    {
        p = p->next;//向后移动指针直到i位置
        j++;
    }

    //若i结点不存在
    if (!p || j > i)
    {
        exit(0);
    }

    s = p->next;
    p->next = s->next;
    *e = s->data;
    free(s);

    return *L;
}
数据结构复习笔记(二)——线性表的链式存储结构之单链表_第8张图片
删除

单链表的整表删除

void ClearList(LinkList *L) {
    LinkList p;
    LinkList q;
    p = *L; //指向头结点
    while (q) {
        q = p->next;
        free(p);
        p = q;
    }
    (*L)->next = NULL;

}

你可能感兴趣的:(数据结构复习笔记(二)——线性表的链式存储结构之单链表)