【C 语言】从代码示例入手(十八)链表二:链式存储

 《C 语言从代码示例入手》系列文章将带你开启 C 语言编程的探索之旅。通过大量简单且实用的代码示例,由浅入深地展现 C 语言的核心知识点,包括变量、数据类型、运算符、控制结构、函数等。每一个代码示例都有详细的解释和注释,让你能轻松理解代码的功能和运行原理,助你逐步掌握 C 语言的编程技巧,快速提升编程能力,为后续深入学习和开发打下坚实基础。

关于C语言的运行环境安装配置,请参看:【C 语言】从代码示例入手(零)

目录

三、 链表的链式存储

1、头文件定义代码

2、函数实现代码

(1)初始化链表

(2)在指定位置插入

(3)删除指定位置的值

(4)链表的长度

(5)查找元素

(6)返回第一个结点的数据

(7)打印链表结点

(8)释放链表内存

3、主函数调用代码

4、运行界面

5、运行结果

6、遇到的问题


三、 链表的链式存储

1、头文件定义代码

LinkList.h

#ifndef LINKLIST_H
#define LINKLIST_H  //防止头文件重复调用

//引入头文件库

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


//链表结点
typedef struct LINKNODE{
    void* data; //无类型指针:可以存放任何类型数据
    struct LINKNODE* next; //链表next指针
} LinkNode;

//链表结构体
typedef struct LINKLIST{
    LinkNode* head; //链表头节点
    int size; //链表大小
    //这里不需要容量,不需要初始化

} LinkList;


//---------------------------------------
/**
 * 打回调函数【函数指针】---【实现由用户决定】
 * (*COMPARE_NODE)函数类型
 * Circle_LinkNode* 函数参数
 */
typedef void(*PRINTLINKNODE)(void*);
//---------------------------------------

//初始化链表
LinkList* Init_LinkList();

//在指定位置插入
void Insert_LinkList(LinkList* list, int post, void* data);

//删除指定位置的值
void RemoveByPos_LinkList(LinkList* list, int pos);

//链表的长度
int Size_LinkList(LinkList* list);

//查找
int Find_LinkList(LinkList* list, void* data);

//返回第一个节点的数据
void* Front_LinkList(LinkList* list);

//打印链表结点
void Print_LinkList(LinkList* list, PRINTLINKNODE print);

//释放链表内存
void FreeSpace_LinkList(LinkList* list);

#endif

2、函数实现代码

(1)初始化链表

//初始化链表
LinkList* Init_LinkList(){
    //分配内存
    LinkList* list = (LinkList*) malloc(sizeof (LinkList));

    //-----初始化开始--------
    list->size = 0;

    //创建头结点并初始化:头结点不保存数据信息,就是加个标识而已
    list->head = (LinkNode*)malloc(sizeof (LinkNode));
    list->head->data = NULL; //链表->头结点->数据 = NULL
    list->head->next = NULL; //链表->头结点->指向下个结点的指针 = NULL
    //-----初始化结束--------

    return list;
}

代码说明:

  • 重点是先为链表结构体 LinkList 分配内存,接着初始化其 size 为 0 。
  • 然后为头结点 LinkNode 分配内存,将头结点的 data 设为 NULL ,next 指针也设为 NULL ,最后返回初始化好的链表指针。


(2)在指定位置插入

//在指定位置插入
void Insert_LinkList(LinkList* list, int pos, void* data){
    if(list == NULL || data ==NULL){
        return;
    }

    //链表的下标越界时,将默认插入到链表尾部
    if(pos<0 || pos >list->size){
        pos = list->size;
    }

    //第一步:创建新的结点
    LinkNode* newnode = (LinkNode*)malloc(sizeof (LinkNode));
    newnode->data = data;
    newnode->next = NULL;

    /**
     * 插入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超越超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值