目录
前言
此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。
已完成内容
[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:02-单链表(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:03-栈(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:07-二叉树(无头结点)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:10-二叉排序树(无头结点)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:11-冒泡排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:14-选择排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:15-堆排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:17-双链表(带头结点)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:18-链栈(不带头结点)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:19-串KMP模式匹配(数组)(C语言实现)_Chandni.的博客-优快云博客
[数据结构]:20-线索二叉树(无头结点)(C语言实现)_Chandni.的博客-优快云博客
并查集实现
01-开发环境
语言:C/C++14
编译器:MinGW64
集成开发环境:CLion2022.1.3
02-文件布局
请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。
03-代码
01-主函数
用于测试。
#include "./Head/UFData.h"
#include "./Source/UFFunction.cpp"
int main() {
Initial(UFSets);
// 合并
UnionRandomNode(UFSets, 0, 3);
UnionRandomNode(UFSets, 5, 2);
UnionRandomNode(UFSets, 1, 4);
UnionRandomNode(UFSets, 4, 2);
UnionRandomNode(UFSets, 0, 4);
PrintSets(UFSets);
printf("---------------------------\n");
// 查找
int pos;
pos = FindOptimize(UFSets, 2);
PrintSets(UFSets);
printf("---------------------------\n");
return 0;
}
02-头文件
用于存储结构体和常量等。
//
// Created by 24955 on 2023-03-31.
//
#ifndef INC_07_DISJOINTSETS_UFDATA_H
#define INC_07_DISJOINTSETS_UFDATA_H
// 头文件
#include <stdio.h>
// 常量
#define MAXSIZE 6
typedef int ElemType;
// 结构体-并查集
ElemType UFSets[MAXSIZE];
#endif //INC_07_DISJOINTSETS_UFDATA_H
03-UFFunction.cpp
用于存储并、查等操作。
//
// Created by 24955 on 2023-03-31.
//
// 初始化并查集
void Initial(ElemType UFS[]) {
for (int i = 0; i < MAXSIZE; i++) {
UFS[i] = -1;
}
}
// 查
int Find(ElemType UFS[], int x) {
/*
* 1. 数组所存值为当前元素根结点下标
* 2. 为负数时,表示为根结点*/
while (UFS[x] >= 0) {
x = UFS[x];
}
// 返回根结点下标
return x;
}
// 查优化-压缩路径
int FindOptimize(ElemType UFS[], int x) {
int root = x;
// 寻找父结点
while (UFS[root] >= 0) {
root = UFS[root];
}
// 压缩路径
while (x != root) {
// 记录x的父节点
int parent = UFS[x];
UFS[x] = root;
x = parent;
}
return root;
}
// 合并
void Union(ElemType UFS[], int Root1, int Root2) {
/*
* 1. 若两集合有交集直接返回
* 2. 否则把root2合并到root1中*/
if (Root1 == Root2) {
return;
}
// 把root2合并到root1中
UFS[Root2] = Root1;
}
// Union优化-小树合并到大树中
void UnionOptimize(ElemType UFS[], int Root1, int Root2) {
/*
* 1. 用数组值表示当前树结点个数
* 2. 将小树合并到大树中*/
if (Root1 == Root2) {
return;
}
// root2为小树
if (UFS[Root2] >= UFS[Root1]) {
UFS[Root1] += UFS[Root2];
UFS[Root2] = Root1;
} else {
// root1为小树
UFS[Root2] += UFS[Root1];
UFS[Root1] = Root2;
}
}
// 合并任意两个结点
void UnionRandomNode(ElemType UFS[], int Node1, int Node2) {
/*
* 1. 找到根结点
* 2. 合并*/
int Root1, Root2;
Root1 = Find(UFS, Node1);
Root2 = Find(UFS, Node2);
UnionOptimize(UFS, Root1, Root2);
}
// 打印输出集合值
void PrintSets(ElemType UFS[]) {
for (int i = 0; i < MAXSIZE; i++) {
printf("%5d", UFS[i]);
}
printf("\n");
}
结语
此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。