数据结构——单链表

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;
}
相关推荐
小江的记录本35 分钟前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
落羽的落羽2 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
萑澈3 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
yuannl104 小时前
数据结构----二叉排序树(ai修改版)
数据结构
iiiiyu4 小时前
集合进阶(Map集合)
java·大数据·开发语言·数据结构·编程语言
小江的记录本5 小时前
【Java基础】核心关键字:final、static、volatile、synchronized、transient(附《思维导图》+《面试高频考点清单》)
java·前端·数据结构·后端·ai·面试·ai编程
go不是csgo6 小时前
两个Redis数据结构搞定签到和UV统计:Bitmap与HyperLogLog实战
数据结构·redis·uv
悠仁さん6 小时前
数据结构 栈与队
数据结构
Plan-C-7 小时前
二叉树的遍历
java·数据结构·算法
历程里程碑7 小时前
54 深入解析poll多路复用技术
java·linux·服务器·开发语言·前端·数据结构·c++