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;
}

上一篇:关于单链表的知识和其算法功能的简单介绍


下一篇:第三周总结