C语言实现缺陷管理系统:二叉链表存储与操作

本文将介绍使用C语言实现一个简单的缺陷管理系统,并使用二叉链表存储缺陷信息。该系统将提供以下功能:

  1. 初始化创建二叉链表:存储给定的缺陷信息。
  2. 按层次所属关系输出:以树状结构输出缺陷信息。
  3. 查找并输出所有最低一级缺陷名:找到所有最底层的缺陷。
  4. 输出所有缺陷分类名:输出所有非叶子节点的缺陷名称。
  5. 删除某一缺陷分类包含的缺陷名:删除指定分类下的所有缺陷和该分类本身。
  6. 插入一种缺陷:将新的缺陷插入到指定的分类下。

代码示例

#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 成员。

其他二叉树应用案例

  1. 求二叉树的深度
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;
    }
}
  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;
        }
    }
}
  1. 查找二叉树中是否存在某个结点
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语言实现简单的缺陷管理系统,并利用二叉链表进行数据存储和操作。二叉树是一种常见的数据结构,在实际应用中有着广泛的用途,例如数据库索引、表达式树、文件系统等。希望本文能够帮助读者理解二叉树的基本概念和应用方式。

C语言实现缺陷管理系统:二叉链表存储与操作

原文地址: https://www.cveoy.top/t/topic/oRjs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录