C语言-链表例程

c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct LNode {
    int data;              // 数据域
    struct LNode *next;    // 指针域
} LNode;

// ================== 尾插法创建:不带头结点 ==================
LNode *createTailNoHead() {
    LNode *L = NULL;       // 空链表
    LNode *tail = NULL;    // 始终指向表尾结点
    int n;

    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        LNode *s = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &s->data);
        s->next = NULL;

        if (L == NULL) {   // 也可写 if(tail == NULL)
            L = tail = s;
        } else {
            tail->next = s;
            tail = s;
        }
    }

    return L;
}

// ================== 尾插法创建:带头结点 ==================
LNode *createTailWithHead() {
    LNode *L = (LNode *)malloc(sizeof(LNode)); // 头结点,不存有效数据
    L->next = NULL;

    LNode *tail = L;       // 尾指针初始指向头结点
    int n;

    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        LNode *s = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &s->data);
        s->next = NULL;

        tail->next = s;
        tail = s;
    }

    return L;
}

// ================== 头插法创建:带头结点 ==================
LNode *createHeadWithHead() {
    LNode *L = (LNode *)malloc(sizeof(LNode)); // 头结点
    L->next = NULL;

    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        LNode *s = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &s->data);

        s->next = L->next;
        L->next = s;
    }

    return L;
}

// ================== 遍历输出链表 ==================
void printList(LNode *L) {
    // 如果不带头结点
    LNode *p = L;

    // 如果带头结点,用下面这句:
    // LNode *p = L->next;

    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

// ================== 释放链表 ==================
void freeList(LNode *L) {
    // 如果不带头结点
    LNode *p = L;

    // 如果带头结点,用:
    // LNode *p = L;

    while (p != NULL) {
        LNode *q = p;
        p = p->next;
        free(q);
    }
}

int main() {
    // 示例:尾插法不带头
    LNode *L1 = createTailNoHead();
    printList(L1);
    freeList(L1);

    // 示例:尾插法带头
    // LNode *L2 = createTailWithHead();
    // printList(L2);
    // freeList(L2);

    // 示例:头插法带头
    // LNode *L3 = createHeadWithHead();
    // printList(L3);
    // freeList(L3);

    return 0;
}

尾插不带头:

c 复制代码
if (L == NULL) {
    L = tail = s;
} else {
    tail->next = s;
    tail = s;
}

尾插带头:

c 复制代码
LNode *L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
LNode *tail = L;          // 尾指针指向头结点

// 每次插入新结点 s
tail->next = s;           // 头/尾结点 next 指向新结点
tail = s;                 // 尾指针移动到新结点
s->next = NULL;           // 新结点成为尾结点

头插带头:

c 复制代码
s->next = L->next;
L->next = s;
相关推荐
晓蛋4 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊4 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿4 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy4 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
phltxy4 天前
C 语言中的数据存储:从类型到二进制位
c语言
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超4 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust