[C语言]STL-链表(LinkList)结构简单实现

链表(LinkList)结构简单实现

[C++]STL-list容器

头文件: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;
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值