数据结构——单链表

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;
}
相关推荐
皮皮哎哟3 小时前
深入浅出双向链表与Linux内核链表 附数组链表核心区别解析
c语言·数据结构·内核链表·双向链表·循环链表·数组和链表的区别
wWYy.3 小时前
指针与引用区别
数据结构
历程里程碑3 小时前
Linux 17 程序地址空间
linux·运维·服务器·开发语言·数据结构·笔记·排序算法
-dzk-4 小时前
【代码随想录】LC 203.移除链表元素
c语言·数据结构·c++·算法·链表
齐落山大勇4 小时前
数据结构——栈与队列
数据结构
毅炼4 小时前
hot100打卡——day17
java·数据结构·算法·leetcode·深度优先
404未精通的狗4 小时前
(数据结构)二叉树(上)
数据结构
寄存器漫游者5 小时前
数据结构 C语言 顺序栈
java·c语言·数据结构
日拱一卒——功不唐捐6 小时前
循环队列+双端队列(C语言)
c语言·数据结构