树的双亲表示法(链表实现) -B

本文介绍了树的双亲表示法,特别是通过链表实现的方式。内容包括链表结构的定义,树节点包含数据域、双亲域、长子域、左兄弟域和右兄弟域,并通过id标识进行顺序记录。文章提供了C语言的实现代码,包括main.c、ParentTree.c和ParentTree.h三个文件。
摘要由CSDN通过智能技术生成

简述说明

其它实现方法:
1.树的双亲表示法(数组实现) -A
2.树的双亲表示法(数组实现) -B
3.树的双亲表示法(链表实现) -A

在树的双亲表示法(链表实现) -A中添加了 长子 左兄弟 右兄弟

  • 采用链表实现树的双亲表示法(带头结点).
  • 树结点: 数据域 & 双亲域 & 长子域 & 左兄弟域 & 右兄弟域 & id标识.
  • 树结点的id标识按顺序记录.
  • 修改数据域数据类型则需要修改部分代码使兼容.
  • 树结点按层序序列存储.
  • 当最大结点数(T->maxsize)为0时, 则不限制最大结点数.

存储结构

在这里插入图片描述

c语言实现代码

  • main.c
#include <stdio.h>
#include <stdlib.h>
#include "ParentTree.h"

/*********************************/
#define STR_MAXSIZE 1024

#if _WIN32
    #define CLEARSCREEN "cls"
#elif __linux__
    #define CLEARSCREEN "clear"
#endif
/*********************************/



/*=============== 树的双亲存储结构函数测试列表 ===============*/
void PrintMenu(void);
void ClearStdin(void);
void Pause(void);

void InitTree_Test(PTree *T);
void CreateTree_Test(PTree *T);
void PrintTree_Test(const PTree *T);
void ClearTree_Test(PTree *T);
void DestroyTree_Test(PTree *T);
void TreeEmpty_Test(const PTree *T);
void TreeDegree_Test(const PTree *T);
void TreeDepth_Test(const PTree *T);
void RootValue_Test(const PTree *T);
void Value_Test(const PTree *T);

void Order_Test(const PTree *T);
void Assign_Data_Test(const PTree *T);
void Assign_Id_Test(const PTree *T);
void ChildValue_Data_Test(const PTree *T);
void ChildValue_Id_Test(const PTree *T);
void Sibling_Data_Test(const PTree *T);
void Sibling_Id_Test(const PTree *T);
void ChildCount_Data_Test(const PTree *T);
void ChildCount_Id_Test(const PTree *T);
void ChildSeat_Data_Test(const PTree *T);
void ChildSeat_Id_Test(const PTree *T);

void InsertChild_Data_Test(PTree *T);
void InsertChild_Id_Test(PTree *T);
void InsertTree_Data_Test(PTree *T);
void InsertTree_Id_Test(PTree *T);
void DeleteTree_Data_Test(PTree *T);
void DeleteTree_Id_Test(PTree *T);
/*====================================================*/



void PrintMenu(void) {
   
    system(CLEARSCREEN);
    puts("1.InitTree \n");
    puts("2.CreateTree \n");
    puts("3.PrintTree \n");
    puts("4.ClearTree \n");
    puts("5.DestroyTree \n");
    puts("6.TreeEmpty \n");
    puts("7.TreeDegree \n");
    puts("8.TreeDepth \n");
    puts("9.RootValue \n");
    puts("10.Value \n");

    puts("11.Order \n");
    puts("12.Assign_Data \n");
    puts("13.Assign_Id \n");
    puts("14.ChildValue_Data \n");
    puts("15.ChildValue_Id \n");
    puts("16.Sibling_Data \n");
    puts("17.Sibling_Id \n");
    puts("18.ChildCount_Data \n");
    puts("19.ChildCount_Id \n");
    puts("20.ChildSeat_Data \n");
    puts("21.ChildSeat_Id \n");

    puts("22.InsertChild_Data \n");
    puts("23.InsertChild_Id \n");
    puts("24.InsertTree_Data \n");
    puts("25.InsertTree_Id \n");
    puts("26.DeleteTree_Data \n");
    puts("27.DeleteTree_Id \n");

    puts("0.Exit \n");
    printf("Input: ");
}

void ClearStdin(void) {
   
    char ch;
    while(ch=getchar(), ch!='\n');
}

void Pause(void) {
   
    puts("Press enter to continue.");
    ClearStdin();
}

void InitTree_Test(PTree *T) {
   
    system(CLEARSCREEN);

    Size_T n;
    printf("Input n: ");
    scanf("%u", &n);
    ClearStdin();

    if(InitTree_P(T, n))
        puts("Error. ");
    else
        puts("Ok. ");

    Pause();
}

void CreateTree_Test(PTree *T) {
   
    system(CLEARSCREEN);

    TElemType_P ch, str[STR_MAXSIZE];
    printf("Input str: ");
    for(Size_T i=0; i<STR_MAXSIZE; i++) {
   
        if(ch=getchar(), ch=='\n') {
   
            str[i] = '\0';
            break;
        }
        str[i] = ch;
    }
    str[STR_MAXSIZE-1] = '\0';

    if(CreateTree_P(T, str))
        puts("Error. ");
    else
        puts("Ok. ");

    Pause();
}

void PrintTree_Test(const PTree *T) {
   
    system(CLEARSCREEN);
    PrintTree_P(T);
    Pause();
}

void ClearTree_Test(PTree *T) {
   
    ClearTree_P(T);
}

void DestroyTree_Test(PTree *T) {
   
    DestroyTree_P(T);
}

void TreeEmpty_Test(const PTree *T) {
   
    system(CLEARSCREEN);
    if(TreeEmpty_P(T))
        puts("The tree is empty. ");
    else
        puts("The tree is not empty. ");
    Pause();
}

void TreeDegree_Test(const PTree *T) {
   
    system(CLEARSCREEN);
    printf("Degree: %u \n", TreeDegree_P(T));
    Pause();
}

void TreeDepth_Test(const PTree *T) {
   
    system(CLEARSCREEN);
    printf("Depth: %u \n", TreeDepth_P(T));
    Pause();
}

void RootValue_Test(const PTree *T) {
   
    system(CLEARSCREEN);
    printf("RootValue: %c \n", RootValue_P(T));
    Pause();
}

void Value_Test(const PTree *T) {
   
    system(CLEARSCREEN);

    PTNode *p;
    Size_T k;
    printf("Input k: ");
    scanf("%u", &k);
    ClearStdin();

    if(p = Value_P(T, k))
        printf("T->nodes[%u] = %c \n", k, p->data);
    else
        printf("T->nodes[%u] = NULL \n", k);
    
    Pause();
}

void Order_Test(const PTree *T) {
   
    system(CLEARSCREEN);

    TElemType_P ch;
    printf("Input ch: ");
    ch = getchar();
    ClearStdin();
    printf("T->nodes[%u] = %c \n", Order_P(T, ch), ch);

    Pause();
}

void Assign_Data_Test(const PTree *T) {
   
    system(CLEARSCREEN);

    TElemType_P ch, value;
    printf("Input ch & value: ");
    scanf("%c %c", &ch, &value);
    ClearStdin();

    if(Assign_Data_P(T, ch, value))
        puts("Error. ");
    else
        puts("Ok. ");

    Pause();
}

void Assign_Id_Test(const PTree *T) {
   
    system(CLEARSCREEN);

    Id_P id;
    TElemType_P value;
    printf("Input id & value: ");
    scanf("%u %c", &id, &value);
    ClearStdin();

    if(Assign_Id_P(T, id, value))
        puts("Error. ");
    else
        puts("Ok. ")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值