单链表相关程序实现编写

本文全面总结了数据结构中的单链表,包括定义链表单一节点结构体、初始化链表、插入数据、删除数据、获取链表长度、查找节点、打印链表以及释放链表内存等功能的程序实现。示例展示了链表中存储学生信息,并进行了查找操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序描述

今天对数据结构之单链表部分进行全面的总结 写了一些链表的基本操作程序

程序实现

单链表的头文件

1、链表单一结点结构体定义
由于未指定数据类型 所以使用void*类型,为空类型 可以通过用户定义的类型进行强制类型转换

typedef struct LINKNODE
{
	void* data; // 无类型指针  指向任何类型的数据
	struct LINKNODE *next;
}LinkNode;

2、链表结构体

typedef struct LINKLIST
{
	LinkNode *head;
	int size; // 没有容量的概念
}LinkList;

3、打印函数指针
定义 PRINTLINKNODE 类型 用来定义打印函数

typedef void(*PRINTLINKNODE)(void*);

4、初始化链表

LinkList* Init_LinkList();

5、指定位置插入数据

void Insert_LinkList(LinkList *list, int pos, void* data);

6、删除指定位置的值

void RemoveByPos_LinkList(LinkList *list, int pos);

7、获得链表的长度

int Size_LinkList(LinkList *list);

8、返回第一个结点

void* Front_LinkList(LinkList *list);

9、查找

int Find_LinkList(LinkList *list, void* data);

10、打印链表

void Print_LinkList(LinkList *list, PRINTLINKNODE print);

11、释放链表内存

void FresSapce_LinkList(LinkList *list);

函数主体

1、初始化链表

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

2、指定位置插入数据

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;
	}
	// 创建新的结点
	LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
	newNode->data = data;
	newNode->next = NULL;

	//找pos位置的前一个结点
	LinkNode *pCurrent = list->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}

	// 新结点入链表
	newNode->next = pCurrent->next;
	pCurrent->next = newNode;
	list->size++;
}

3、删除指定位置的值

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);
	pDel = NULL;
	list->size--;
}

4、获得链表的长度

int Size_LinkList(LinkList *list)
{
	return list->size;
}

5、查找

int Find_LinkList(LinkList *list, void* data)
{
	if (list == NULL)
	{
		return -1;
	}
	if (data == NULL)
	{
		return -1;
	}
	// 遍历查找
	LinkNode *pCurrent = list->head->next;
	int i = 0;
	while (pCurrent)
	{
		if (pCurrent->data == data)
		{
			break;
		}
		i++;
		pCurrent = pCurrent->next;
	}
	return i;
}

6、返回第一个结点

void* Front_LinkList(LinkList *list)
{
	return list->head->next->data;
}

7、打印链表

void Print_LinkList(LinkList *list, PRINTLINKNODE print)
{
	if (list == NULL)
	{
		return;
	}
	// 辅助指针变量
	LinkNode* pCurrent = list->head->next;
	while (pCurrent)
	{
		print(pCurrent->data);
		pCurrent = pCurrent->next;
	}
}

8、释放链表内存

void FresSapce_LinkList(LinkList *list)
{
	if (list == NULL)
	{
		return;
	}
	// 辅助指针
	LinkNode* pCurrent = list->head;
	while (pCurrent)
	{
		// 缓存下一个结点
		LinkNode* pNext = pCurrent->next;
		free(pCurrent);
		pCurrent = pNext;
	}
	// 释放链表内存
	list->size = 0;
	free(list);
}

主函数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkList.h"

// 自定义数据类型
typedef struct PERSON
{
	char name[64];
	int age;
	int score;
}Person;

//打印函数 将void*类型转化为Person类型
void MyPrint(void* data)
{
	Person* p = (Person*)data;
	printf("Name:%s,age:%d,score:%d\n", p->name, p->age, p->score);
}

void test21()
{
	// 创建链表
	LinkList* list = Init_LinkList();

	// 创建数据
	Person p1 = { "aaa", 18, 100 };
	Person p2 = { "bbb", 20, 89 };
	Person p3 = { "ccc", 22, 80 };
	Person p4 = { "ddd", 16, 120 };
	Person p5 = { "eee", 17, 60 };

	// 数据插入链表  尾插法
	Insert_LinkList(list, 0, &p1);
	Insert_LinkList(list, 1, &p2);
	Insert_LinkList(list, 2, &p3);
	Insert_LinkList(list, 3, &p4);
	Insert_LinkList(list, 4, &p5);

	// 打印链表
	Print_LinkList(list, MyPrint);

	// 删除3
	RemoveByPos_LinkList(list, 3);

	//打印
	printf("--------------------------------------\n");
	Print_LinkList(list, MyPrint);

	printf("-------查找结果-----------------------\n");
	Person* ret = (Person*)Front_LinkList(list);
	printf("Name:%s,age:%d,score:%d\n", ret->name, ret->age, ret->score);

	// 销毁链表
	FresSapce_LinkList(list);
}

int main()
{
	test21();
	system("pause");
	return 0;
}

程序运行结果

Name:eee,age:17,score:60
Name:ddd,age:16,score:120
Name:ccc,age:22,score:80
Name:bbb,age:20,score:89
Name:aaa,age:18,score:100
-----------------------------------------
Name:eee,age:17,score:60
Name:ddd,age:16,score:120
Name:ccc,age:22,score:80
Name:aaa,age:18,score:100
-------查找结果-----------------------
Name:eee,age:17,score:60
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值