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;
相关推荐
\光辉岁月/11 小时前
15.JavaSE-网络
java·开发语言·网络
兰亭妙微UI设计公司11 小时前
兰亭妙微软件界面设计公司的解锁按钮设计10大密码
开发语言·前端·javascript
人邮异步社区11 小时前
C语言好学,还是Python好学?
c语言·开发语言·python
栈帧之外12 小时前
【C++】红黑树实现
开发语言·c++
程序员老陆12 小时前
C++中同一个回调函数被多个设备并发调用:并发问题不在“函数”,而在“状态”
开发语言·c++·程序设计
wangchunyu11412 小时前
JDK8新特性实战(Lambda、Stream、Optional)
java·开发语言
鱼宵12 小时前
工厂模式实战:消灭魔法数字,把写死的 new 收进一个厂里
开发语言·python
niucloud-admin12 小时前
NIUCLOUD LITE AI开发文档--后台系统结构
开发语言
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 登录发送验证码的测试验证与经验复盘
java·开发语言·交友
马优晨12 小时前
Java中的dto是什么
java·开发语言·java中的dto是什么·java的dto是什么·dto在java中是什么