《C 语言从代码示例入手》系列文章将带你开启 C 语言编程的探索之旅。通过大量简单且实用的代码示例,由浅入深地展现 C 语言的核心知识点,包括变量、数据类型、运算符、控制结构、函数等。每一个代码示例都有详细的解释和注释,让你能轻松理解代码的功能和运行原理,助你逐步掌握 C 语言的编程技巧,快速提升编程能力,为后续深入学习和开发打下坚实基础。
关于C语言的运行环境安装配置,请参看:【C 语言】从代码示例入手(零)
目录
三、 链表的链式存储
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;
/**
* 插入