单链表

Posted by LemonWhale on April 30, 2023

✅ 在我们不知道一组数据的具体长度的时候,链表可以派上用场。

单链表中的节点一般由数据域和指针域组成,数据域中存储所需数据,指针域存放下一个指向下一个节点的指针。以下实例使用C语言中创建了一个单链表,插入数据的方式采用了尾插法。


#include <stdio.h>
#include <stdlib.h>

// 定义节点
typedef int ElementType;
typedef struct NodeList *PtrToNode;
struct NodeList {
    ElementType Data;
    PtrToNode Next;
};
typedef PtrToNode List;

// 创建链表
List CreatList() {
    // 给头结点开辟空间
    PtrToNode L = (PtrToNode)malloc(sizeof(struct NodeList));
    // 如果返回NULL说明内存已满
    if (L == NULL) {
        printf("out of memory!");
        exit(0);
    }
    // 头结点指向NULL
    L->Next = NULL;
    // 返回头节点
    return L;
}

// 使用尾插法插入新节点
List InsertNode(List L, ElementType x) {
    // 找到现有的尾部节点
    PtrToNode tail = L;
    while (tail->Next != NULL) {
        tail = tail->Next;
    }
    // 给新节点开辟空间
    PtrToNode NewNode = (PtrToNode)malloc(sizeof(struct NodeList));
    if (NewNode == NULL) {
        printf("out of memory!");
        exit(1);
    }
    // 给新节点存入数据,然后使新节点指向NULL
    NewNode->Data = x;
    NewNode->Next = NULL;
    // 尾部节点指向新节点,更新尾部节点
    tail->Next = NewNode;
    tail = NewNode;

    return L;
}

// 打印列表的值
List PrintList(List L) {
    // 跳过头节点
    PtrToNode head;
    head = L->Next;
    // 判断是否为空列表
    if (head == NULL) {
        printf("EMPTY LIST!");
        exit(1);
    }
    // 循环打印列表中的值
    while (head != NULL) {
        printf("%d\n", head->Data);
        head = head->Next;
    }
}

int main() {
    List L = CreatList();
    InsertNode(L, 10);
    InsertNode(L, 15);
    PrintList(L);
}