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;
相关推荐
.痞老板.37 分钟前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦40 分钟前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠1 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
starzy19902 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala
zhanghaha13143 小时前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
apcipot_rain3 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕4 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
zhanghaha13144 小时前
C# 系列教程_8 循环语句 保姆级精讲(面向新手)
开发语言·c#
麦麦麦当劳大王12 小时前
【油猴脚本】Boss直聘 岗位职责复制
开发语言·前端·javascript
starzy199012 小时前
深入理解Scala Map:从实现原理到工程实践
开发语言·后端·scala