又是一个单链表的实现(头插法和尾插法)

看了不少资料,之前一直糊涂,感觉刚刚弄明白,所以又写了一遍单链表的实现,包括头插和尾插…C语言的指针果然水深啊。

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

//定义链表节点结构
struct LinkedList {
    int data;
    struct LinkedList *next;
};

//定义一个指向struct LinkedList的指针的类型node
typedef struct LinkedList *node;

/**
 * 创建一个新节点
 * @return node
 */
node create_node() {
    node tmp;
    tmp = (node) malloc(sizeof(struct LinkedList));
    tmp->next = NULL;
    return tmp;
}

/**
 * 尾插法 每次插入的数据放到链表结尾
 */
void add_node_to_tail(node head, int data) {
    node tmp, p;
    //创建一个新节点 并保存入数据
    tmp = create_node();
    tmp->data = data;
    //如果是空表 把新节点直接放到头节点之后
    if(head->next == NULL) {
        head->next = tmp;
    } else {
        //不是空表时 开始遍历链表至尾端
        p = head->next;
        while(p->next!= NULL) {
            p = p->next;
        }
        //把新节点放到尾端
        p->next = tmp;
    }
}

/**
 * 头插法 每次插入的数据放到链表开头
 */
void add_node_to_head(node head, int data) {
    node tmp, p;
    //创建一个新节点
    tmp = create_node();
    tmp->data = data;
    //如果是空表 把新节点直接放到头节点之后
    if(head->next == NULL) {
        head->next = tmp;
    } else {
        //不是空表时 把新节点的QQ交易平台next指向到原链表第一个元素
        tmp->next = head->next;
        //把头节点指向到新节点
        head->next = tmp;
    }
}

int main(void) {
    node listHead, p;
    //创建一个头节点
    listHead = create_node();
    //头插法 新增数据
    add_node_to_head(listHead, 10);
    add_node_to_head(listHead, 20);
    add_node_to_head(listHead, 30);
    add_node_to_head(listHead, 40);
    //尾插法 新增数据
    add_node_to_tail(listHead, 100);
    add_node_to_tail(listHead, 200);

    //遍历链表并打印元素值
    p = listHead->next;
    while(p) {
        printf("%d\n", p->data);
        p = p->next;
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值