ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言之 单向链表的代码

2022-01-12 14:04:47  阅读:136  来源: 互联网

标签:LinkList 单向 void list pCurrent 链表 next C语言


#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//链表结点
typedef struct LINKNODE {
	void* data;//指向任何类型的数据
	struct LINKNODE* next;
}LinkNode;

//链表结构体
typedef struct LINKLIST {
	LinkNode* head;
	int size;
}LinkList;

//打印函数指针
typedef void(*PRINTLINKNODE)(void*);

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

//指定位置插入
void Insert_LinkList(LinkList* list, int pos, 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 // !LINKLIST_H




#include"LinkList.h"



//初始化链表
LinkList* Init_LinkList() {
	LinkList* list = (LinkList*)malloc(sizeof(LinkList));
	list->size = 0;
	//头结点,是不保存数据信息
	list->head = (LinkNode*)malloc(sizeof(LinkNode));
	list->head->data = NULL;
	list->head->next = NULL;
	return list;
}

//指定位置插入
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;

	//找结点
	//辅助指针变量
	LinkNode* 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;
	}
	//查找删除结点的前一个结点
	//辅助指针变量
	LinkNode* pCurrent = list->head;
	for (int i = 0; i < pos; i++) {
		pCurrent = pCurrent->next;
	}

	//缓存删除的结点
	LinkNode* pDel = pCurrent->next;
	pCurrent->next = pDel->next;

	//释放删除结点的内存
	free(pDel);
	list->size--;

}

//获取链表的长度
int Size_LinkList(LinkList* list) {
	return list->size;
}

//查找
int Find_LinkList(LinkList* list, void* data) {
	if (list == NULL || data == NULL) {
		return -1;
	}
	//遍历查找
	//辅助指针变量
	LinkNode* pCurrent = list->head->next;//因为head是没有数据的
	int i = 0;
	while (pCurrent != NULL) {
		if (pCurrent->data == data) {
			break;
		}
		i++;
		pCurrent = pCurrent->next;//移动
	}
	return i;
}

//返回第一个结点
void* Front_LinkList(LinkList* list) {
	return list->head->next->data;
}

//打印链表结点
void Print_LinkList(LinkList* list, PRINTLINKNODE print) {
	if (list == NULL) {
		return;
	}

	//遍历查找
	//辅助指针变量
	LinkNode* pCurrent = list->head->next;//因为head是没有数据的

	while (pCurrent != NULL) {
		print(pCurrent->data);
		pCurrent = pCurrent->next;//移动
	}

}
//释放链表内存
void FreeSpace_LinkList(LinkList* list) {
	if (list == NULL) {
		return;
	}

	//遍历查找
	//辅助指针变量
	LinkNode* pCurrent = list->head->next;//因为head是没有数据的

	while (pCurrent != NULL) {
		//缓存下一个结点
		LinkNode* pNext = pCurrent->next;
		free(pCurrent);
		pCurrent = pNext;//移动
	}
	//释放链表内存
	list->size = 0;
	free(list);
}



//#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "LinkList.h"


//自定义数据类型
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);
}



int main() {

	//创建一个链表
	LinkList* list = Init_LinkList();

	//创建数据 
	Person p1 = { "aaa",18,100 };
	Person p2 = { "bbb",19,90 };
	Person p3 = { "ccc",17,80 };
	Person p4 = { "ddd",20,70 };
	Person p5 = { "eee",21,58 };

	//数据插入链表
	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);
	
	//删除3位置
	RemoveByPos_LinkList(list,3);
	printf("--------------------------------------------------\n");
	Print_LinkList(list, MyPrint);
	
	//返回第一个结点
	Person* ret = (Person*)Front_LinkList(list);
	printf("--------------------------------------------------\n");
	MyPrint(ret);
	//释放
	FreeSpace_LinkList(list);


	
	printf("\n");
	system("pause");
	return 0;
}

标签:LinkList,单向,void,list,pCurrent,链表,next,C语言
来源: https://blog.csdn.net/laocooon/article/details/122452050

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有