链表(LinkList)结构简单实现
头文件:LinkList.h
#ifndef LINK_LIST_H //防止头文件被重复调用
#define LINK_LIST_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//链表节点
typedef struct LISTNODE {
void* data; //无类型指针可以指向任何类型数据
struct LISTNODE* next;
} ListNode;
//链表结构体
typedef struct LINKLIST {
ListNode* head; //存放链表首地址
int size; //当前元素个数
//链表不需要当前容量。因为不需要提前分配内存
}LinkList;
//打印函数指针
typedef void(*PRINTLINKNODE)(void*);
//初始化链表
LinkList* LINK_LIST_INIT();
//在指定位置插入
void Insert_LinkList(LinkList*,int,void* );
//删除指定位置的值
void RemoveByPos_LinkList(LinkList*, int);
//获得链表长度
int Size_LinkList(LinkList*);
//返回第一个节点
void* Front_LinkList(LinkList*);
//查找值的位置
int Find_LinkList(LinkList*,void*);
//打印链表节点
void Print_LinkList(LinkList*,PRINTLINKNODE);
//释放链表内存
void FreeSpace_LinkList(LinkList*);
#endif LINK_LIST_H
实现文件:LinkList.c
#include"LinkList.h"
//初始化链表
LinkList* LINK_LIST_INIT() {
LinkList* mylist = (LinkList*)malloc(sizeof(LinkList));
mylist->size = 0;
//头节点, 不保存数据信息,为了使结构更加清晰
mylist->head = (ListNode*)malloc(sizeof(ListNode));
//初始化头节点
mylist->head->data = NULL;
mylist->head->next = NULL;
return mylist;
}
//在指定位置插入
void Insert_LinkList(LinkList*list, int pos, void* data) {
//先判断传入数据指针是否有空值
if (list == NULL) {
return;
}
if (data == NULL) {
return;
}
//判断插入位置是否在范围内
//进行友好处理,如果pos越界,就将数据插入到尾部
if (pos<0 || pos>list->size) {
pos = list->size;
}
//创建新的节点
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = data;
newNode->next = NULL;
//找到指定节点
//辅助指针
ListNode* pCurrent = list->head;
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
//将新节点插入链表
newNode->next = pCurrent->next;
pCurrent->next = newNode;
list->size++;
}
//删除指定位置的值
void RemoveByPos_LinkList(LinkList* list, int pos) {
//先判断传入数据指针是否有空值
if (list == NULL) {
return;
}
//判断插入位置是否在范围内
if (pos<0 || pos>list->size) {
return;
}
ListNode* pCurrent = list->head;
//查找删除节点前一个节点
for (int i = 0; i < pos - 1; i++) {
pCurrent = pCurrent->next;
}
//缓存删除节点
ListNode* pDel = pCurrent->next;
pCurrent->next = pDel->next;
//释放删除节点内存
free(pDel);
}
//获得链表长度
int Size_LinkList(LinkList* list) {
return list->size;
}
//返回第一个节点
void* Front_LinkList(LinkList* list) {
return list->head->next->data;
}
//查找值的位置
int Find_LinkList(LinkList* list, void* data) {
if (list == NULL) {
return-1;
}
if (data == NULL) {
return-1;
}
//遍历查找
ListNode* pCurrent = list->head->next;
int i = 0; //记录位置
while (pCurrent!=NULL) {
if(pCurrent==data){
break;
}
i++;
pCurrent = pCurrent->next;
}
return i;
}
//打印链表节点
void Print_LinkList(LinkList* list, PRINTLINKNODE print) {
if (list == NULL) {
return;
}
//辅助指针变量
ListNode* pCurrent = list->head->next;
while (pCurrent != NULL) {
print(pCurrent->data);
pCurrent = pCurrent->next;
}
}
//释放链表内存
void FreeSpace_LinkList(LinkList* list) {
if (list == NULL) {
return;
}
//辅助指针变量
ListNode* pCurrent = list->head;
while (pCurrent != NULL) {
//先缓存下一个节点
ListNode* pNext = pCurrent->next;
free(pCurrent);
pCurrent = pNext;
}
//最后释放链表内存
list->size = 0;
free(list);
}
主文件:Main.c
//自定义数据类型
typedef struct PERSON {
char name[64];
int age;
int score;
}Person;
//打印函数
void MyPrint(void* data) {
Person* p = (Person*)data;
printf("Name:%s,Age:%d,Score:%d\n", p->name, p->age, p->score);
}
void LinkListTest() {
//创建链表
LinkList* list = LINK_LIST_INIT();
//创建数据
Person p1 = { "Tom",18,99 };
Person p2 = { "Bob",14,95 };
Person p3 = { "Leslie",15,94 };
Person p4 = { "Hugo",18,91 };
Person p5 = { "Lala",20,100 };
//将数据插入链表
Insert_LinkList(list, 0, &p1);
Insert_LinkList(list, 0, &p2);
Insert_LinkList(list, 0, &p3);
Insert_LinkList(list, 0, &p4);
Insert_LinkList(list, 0, &p5);
//调用打印方法
Print_LinkList(list,MyPrint);
printf("----------------------\n");
//调用删除方法
RemoveByPos_LinkList(list, 3);
Print_LinkList(list, MyPrint);
//返回第一个节点
Person* ret=(Person*)Front_LinkList(list);
printf("----------------------\n");
printf("Name:%s,Age:%d,Score:%d\n", ret->name, ret->age, ret->score);
//销毁链表
FreeSpace_LinkList(list);
}
int main(){
LinkListTest();
system("pause");
return 0;
}
原文链接: https://www.cnblogs.com/renboyu/p/13150249.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
![[C语言]STL-链表(LinkList)结构简单实现](https://www.ccppcoding.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/371233
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!