C语言实现缺陷管理系统:二叉链表存储与操作
C语言实现缺陷管理系统:二叉链表存储与操作
本文将介绍使用C语言实现一个简单的缺陷管理系统,并使用二叉链表存储缺陷信息。该系统将提供以下功能:
- 初始化创建二叉链表:存储给定的缺陷信息。
- 按层次所属关系输出:以树状结构输出缺陷信息。
- 查找并输出所有最低一级缺陷名:找到所有最底层的缺陷。
- 输出所有缺陷分类名:输出所有非叶子节点的缺陷名称。
- 删除某一缺陷分类包含的缺陷名:删除指定分类下的所有缺陷和该分类本身。
- 插入一种缺陷:将新的缺陷插入到指定的分类下。
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 50
// 定义缺陷结构体
t typedef struct defect {
char code[MAX_LEN]; // 编码
char name[MAX_LEN]; // 名称
struct defect *lchild; // 左子结点
struct defect *rchild; // 右子结点
} Defect;
// 初始化创建二叉链表
Defect *init() {
Defect *root = (Defect *)malloc(sizeof(Defect));
strcpy(root->code, "SBQX01");
strcpy(root->name, "设备缺陷");
root->lchild = (Defect *)malloc(sizeof(Defect));
strcpy(root->lchild->code, "YLQX01");
strcpy(root->lchild->name, "一类缺陷");
root->lchild->lchild = (Defect *)malloc(sizeof(Defect));
strcpy(root->lchild->lchild->code, "WDYC01");
strcpy(root->lchild->lchild->name, "发电机线圈温度异常");
root->lchild->rchild = (Defect *)malloc(sizeof(Defect));
strcpy(root->lchild->rchild->code, "DJYY01");
strcpy(root->lchild->rchild->name, "煤机清扫电机异音");
root->rchild = (Defect *)malloc(sizeof(Defect));
strcpy(root->rchild->code, "ELQX02");
strcpy(root->rchild->name, "二类缺陷");
return root;
}
// 按层次所属关系输出
void levelOrder(Defect *root) {
Defect *queue[MAX_LEN];
int front = 0, rear = 0;
queue[rear++] = root;
while (front < rear) {
Defect *p = queue[front++];
printf("%s %s\n", p->code, p->name);
if (p->lchild != NULL) {
queue[rear++] = p->lchild;
}
if (p->rchild != NULL) {
queue[rear++] = p->rchild;
}
}
}
// 查找并输出所有最低一级缺陷名
void findLowest(Defect *root) {
if (root != NULL) {
if (root->lchild == NULL && root->rchild == NULL) {
printf("%s ", root->name);
} else {
findLowest(root->lchild);
findLowest(root->rchild);
}
}
}
// 输出所有分类名
void findAll(Defect *root) {
if (root != NULL) {
printf("%s ", root->name);
findAll(root->lchild);
findAll(root->rchild);
}
}
// 删除某一缺陷分类包含的缺陷名
void deleteDefect(Defect *root, char *name) {
if (root != NULL) {
if (root->lchild != NULL && strcmp(root->lchild->name, name) == 0) {
free(root->lchild);
root->lchild = NULL;
} else if (root->rchild != NULL && strcmp(root->rchild->name, name) == 0) {
free(root->rchild);
root->rchild = NULL;
} else {
deleteDefect(root->lchild, name);
deleteDefect(root->rchild, name);
}
}
}
// 插入一种缺陷
void insertDefect(Defect *root, char *parent, char *code, char *name) {
if (root != NULL) {
if (strcmp(root->name, parent) == 0) {
if (root->lchild == NULL) {
root->lchild = (Defect *)malloc(sizeof(Defect));
strcpy(root->lchild->code, code);
strcpy(root->lchild->name, name);
} else if (root->rchild == NULL) {
root->rchild = (Defect *)malloc(sizeof(Defect));
strcpy(root->rchild->code, code);
strcpy(root->rchild->name, name);
}
} else {
insertDefect(root->lchild, parent, code, name);
insertDefect(root->rchild, parent, code, name);
}
}
}
int main() {
Defect *root = init();
printf("按层次所属关系输出:\n");
levelOrder(root);
printf("查找并输出所有最低一级缺陷名:\n");
findLowest(root);
printf("\n输出所有分类名:\n");
findAll(root);
printf("\n在“一类缺陷”下插入“电动阀电气故障”:\n");
insertDefect(root, "一类缺陷", "DDFDQGZ01", "电动阀电气故障");
levelOrder(root);
printf("在“二类缺陷”下插入“继电保护装置”:\n");
insertDefect(root, "二类缺陷", "JDBHZZ01", "继电保护装置");
levelOrder(root);
printf("删除“二类缺陷”分类:\n");
deleteDefect(root, "二类缺陷");
levelOrder(root);
return 0;
}
测试数据和代码意义
| 代码 | 名称 | |------|----------------------| | SBQX01 | 设备缺陷 | | YLQX01 | 一类缺陷 | | ELQX02 | 二类缺陷 | | WDYC01 | 发电机线圈温度异常 | | DJYY01 | 煤机清扫电机异音 | | DDFDQGZ01 | 电动阀电气故障 | | JDBHZZ01 | 继电保护装置 |
- 代码部分用作缺陷的唯一标识符,在二叉链表中作为结构体的
code成员。 - 名称部分用作缺陷的描述,在二叉链表中作为结构体的
name成员。
其他二叉树应用案例
- 求二叉树的深度
int depth(Defect *root) {
if (root == NULL) {
return 0;
} else {
int leftDepth = depth(root->lchild);
int rightDepth = depth(root->rchild);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
- 判断二叉树是否是平衡二叉树
int isBalanced(Defect *root) {
if (root == NULL) {
return 1;
} else {
int leftDepth = depth(root->lchild);
int rightDepth = depth(root->rchild);
int diff = abs(leftDepth - rightDepth);
if (diff <= 1 && isBalanced(root->lchild) && isBalanced(root->rchild)) {
return 1;
} else {
return 0;
}
}
}
- 查找二叉树中是否存在某个结点
Defect *search(Defect *root, char *code) {
if (root == NULL) {
return NULL;
} else if (strcmp(root->code, code) == 0) {
return root;
} else {
Defect *result = search(root->lchild, code);
if (result != NULL) {
return result;
} else {
return search(root->rchild, code);
}
}
}
总结
本文通过实例演示了如何使用C语言实现简单的缺陷管理系统,并利用二叉链表进行数据存储和操作。二叉树是一种常见的数据结构,在实际应用中有着广泛的用途,例如数据库索引、表达式树、文件系统等。希望本文能够帮助读者理解二叉树的基本概念和应用方式。
原文地址: https://www.cveoy.top/t/topic/oRjs 著作权归作者所有。请勿转载和采集!