数据结构——单链表

1. 传作灵感

在学习数据结构的时候,如果不动手写代码,始终学不会,所以通过几个简单的函数,熟悉单链表,提升自己的代码能力。

2. 单链表的定义

cpp 复制代码
#include <iostream>
#include <string>
#include<stdlib.h>
#include<stdio.h>

using namespace std;  // 全局引入std命名空间

#define OK 1
#define ERR 0

//链表的定义
typedef struct Node
{
	char name[50];
	struct Node* next;
}node;

typedef node* Linklist;
typedef int Status;

3.读取链表中的元素

cpp 复制代码
//读取链表中的元素
Status GetElem(Linklist L, int i, char* e)
{
	int j;
	Linklist p;
	p = L->next;
	j = 1;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (!p)
		return ERR;

	strcpy_s(e,50, p->name);

	return OK;
}

3. 插入一个节点

注意这里的参数,Linklist 本身已经是指向结构体的指针,这里使用的是Linklist * L,它是是一个二重指针。一维指针可以指向具体的变量,而在需要改变指针的指向的时候,则需要用二维指针。

cpp 复制代码
//插入一个节点
Status LinkInsertNode(Linklist * L, int i, const char* e)
{
	int j;
	Linklist p, s;
	p = *L;
	j = 1;
	while (p && j < i)
	{
		p = p->next;
		++j;

	}
	if (!p)
		return ERR;
	s = (Linklist)malloc(sizeof(node));

	strcpy_s(s->name, e);

	s ->next = p->next;
	p->next = s;
	return OK;


}

4. 删除一个节点

cpp 复制代码
//删除链表中的一个节点
Status LinkDeleteNode(Linklist* L, int i, char *e)
{
	int j = 1;
	Linklist p,q;
	p = *L;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (!p)
		return ERR;

	q = p->next;
	p->next = q->next;

	strcpy_s(e, 50, q->name);
	free(q);

	return OK;



}

5. 清空链表

这里只是清空链表中的数据,但是保留了链表头

cpp 复制代码
//清空整个链表
Status ClearList(Linklist* L)
{
	Linklist p, q;
	p = (*L)->next;
	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*L)->next = NULL;
	return OK;
}

6. 调用实例

通过使用这几个函数,就可以熟悉链表的基本用法

cpp 复制代码
int main()
{
	Status Insertstatus;

	Linklist LL = (Linklist)malloc(sizeof(node));
	LL->next = NULL;

	// 插入3个节点
	LinkInsertNode(&LL, 1, "ZhangSan");
	LinkInsertNode(&LL, 2, "LiSi");
	LinkInsertNode(&LL, 3, "WangWu");
	LinkInsertNode(&LL, 4, "ZhaoLiu");

	// 读取第2个节点
	char buf[50];
	char buf1[50];
	if (GetElem(LL, 3, buf) == OK) {
		printf("第3个节点:%s\n", buf);  // 输出:LiSi
	}
	printf("删除节点之后!\n");

	LinkDeleteNode(&LL, 3, buf1);
	if (GetElem(LL, 3, buf) == OK) {
		printf("第3个节点:%s\n", buf);  // 输出:LiSi
	}


	return 0;
}
相关推荐
信奥卷王10 小时前
[GESP202509 六级] 划分字符串(含视频)
数据结构·算法
m0_7520356311 小时前
Redis 数据结构总结
数据结构·数据库·redis
tachibana211 小时前
Go 语言的 Map 是否是并发安全的?
开发语言·数据结构·后端·golang·go·语言
Logic10112 小时前
C语言/数据结构字符串题解:统计“chhc“子串权值总和——一次遍历模式匹配
c语言·数据结构·算法·字符串·时间复杂度·空间复杂度·ascii
我命由我1234512 小时前
LRU 缓存淘汰策略
数据结构·redis·学习·mysql·算法·缓存·学习方法
垆边人似月.12 小时前
华为题:合并区间
数据结构·c++·算法
垆边人似月.13 小时前
华为题:滑动窗口最大值
数据结构·c++·算法
m0_5474866613 小时前
《数据结构 (C语言)》期末试卷及答案(10套)2026版
c语言·开发语言·数据结构
杜 硕14 小时前
归并排序详解
数据结构·算法·排序算法
_wxd66616 小时前
二叉搜索树(BST)万字详解:概念、操作、性能分析与 C++ 实现
数据结构·c++·二叉搜索树