单链表实现源码 - C/C++版

这次采用了分文件开发,一共分三个文件:
1、MyCode.h   --    头文件
      存放了定义的函数以及需要的头文件
2、MyCode.cpp  --  函数文件
      对头文件定义的函数进行书写
3、Text01.cpp   --    主函数
      进行函数的调用和运行


 MyCode.h

#pragma once
#include<stdio.h>
#include<stdlib.h>

// 这是一个定义函数的库
// 里面定义了单链表的一些基本操作
/*
* 初始化函数
* 增 :头插法、尾插法、在指定数据后插入
* 删 :删除某个数据
* 查 :查找函数
* 改 :( )
* 展示整个链表的数据
* 统计链表数据的函数
*/

typedef struct Node {
	int data;
	struct Node* next;
}Node, *Linklist;

// 初始化函数
Linklist InitList();

// 头插法
Linklist Heart_insert(Linklist l, int k);

// 尾插法
Linklist Rear_insert(Linklist l, int k);

// 查找
Node* find(Linklist l, int x);

// 在指定数据后插入数据
Linklist Insert(Linklist l, int x, int k);

// 删除指定数据
Linklist Delet(Linklist l, int k);

// 统计链表中数据的个数
int get_size(Linklist l);

// 展示函数
void Show(Linklist l);

MyCode.cpp

#include "MyCode.h"

// 初始化一个带头结点的单链表
Linklist InitList() {
	Node* h = (Node*)malloc(sizeof(Node));
	if (h == NULL) {
		printf("申请内存失败\n");
		return NULL;
	}
	h->next = NULL;
	return h;
}

// 头插法
Linklist Heart_insert(Linklist l, int k) {
	Node* s = (Node*)malloc(sizeof(Node));
	s->data = k;
	s->next = l->next;
	l->next = s;
	return l;
}

// 尾插法
Linklist Rear_insert(Linklist l, int k) {
	Node* p = l;
	while (p->next != NULL) {
		p = p->next;
	}
	Node* s = (Node*)malloc(sizeof(Node));
	s->data = k;
	s->next = p->next;
	p->next = s;
	return l;
}

// 查找
Node* find(Linklist l, int x) {
	Node* p = l->next;
	while (p != NULL && p->data != x) {
		p = p->next;
	}
	return p;
}

// 在指定数据k后插入数据x
Linklist Insert(Linklist l, int x, int k) {
	Node* p = find(l, x);
	if (p == NULL) {
		printf("数据不存在,不能插入\n");
		return l;
	}
	else {
		Node* s = (Node*)malloc(sizeof(Node));
		s->data = k;
		s->next = p->next;
		p->next = s;
		return l;
	}
}

// 删除指定数据
Linklist Delet(Linklist l, int k) {
	if (l->next == NULL) {
		printf("空链表不能执行删除操作\n");
		return l;
	}
	Node* p = l;
	Node* q = l->next;
	while (q != NULL && q->data != k) {
		p = q;
		q = q->next;
	}
	if (q == NULL) {
		printf("要删除的数据不存在\n");
		return l;
	}
	p->next = q->next;
	free(q);
	q = NULL;      // 防止 q 变成野指针
	return l;
}

// 统计链表中数据的个数
int get_size(Linklist l) {
	Node* p = l->next;
	int sum = 0;
	while (p != NULL) {
		sum++;
		p = p->next;
	}
	return sum;
}

// 展示函数
void Show(Linklist l) {
	Node* p = l->next;
	while (p != NULL) {
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

Test01.cpp

#include "MyCode.h"

int main() {
	Linklist L = NULL;
	L = InitList();

	for (int i = 1; i < 6; i++) {
		L = Rear_insert(L, i);
	}

	L = Insert(L, 1, 6);

	L = Delet(L, 4);

	int sum = get_size(L);

	Show(L);

	printf("%d", sum);
}

将这三个文件导入成这个样子就可以运行啦!


详细的源码讲解可以看下面的文章:

https://blog.csdn.net/2301_80147864/article/details/147447904?spm=1001.2014.3001.5502


Tips:

OK,最后感谢您能看到这里,如果感觉内容还不错的话能不能给我一个点赞加关注,您的认可是我继续创作的最大动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值