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;
相关推荐
shmily麻瓜小菜鸡1 小时前
JavaScript / TypeScript 易踩坑知识点 —— 作用域与变量类
开发语言·javascript·typescript
Lyyaoo.1 小时前
【链表】【中等】两数相加/倒N删除/两个交换/排序链表/LRU缓存
数据结构·链表·缓存
YYYing.1 小时前
【C++进阶系列 (一)】关于线程堆栈的那些事 (上篇)
c语言·开发语言·c++·线程堆栈
Discipline~Hai1 小时前
Linux网络编程05-sqlite3数据库
linux·c语言·网络·数据库·sqlite·linux应用软件编程
zh73141 小时前
Go 1.23 → 1.26 升级检查文档
开发语言·chrome·golang
CRMEB系统商城1 小时前
汽车养护连锁的数字化底座CRMEB 多门店系统实战方案
java·开发语言·小程序·开源·汽车
bro_Java6661 小时前
链表进阶:链表笔试真题
数据结构·链表
努力努力再努力wz1 小时前
【Redis入门系列】:从 RESP 协议到 redis-plus-plus:Redis 客户端编程与 C++ 接口设计
开发语言·数据库·c++·redis·分布式·缓存·架构
736c2 小时前
C语言-指针 11
c语言