数据结构 树的链式存储(二叉表示法)

//树的链式存储--二叉表示法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct _TreeNode{
    //数据域
    int data;
    //指针域
    struct _TreeNode * leftchild;//左孩子指针
    struct _TreeNode * rightchild;//右孩子指针
}TreeNode, *TreeNodePointer;

/*
以上语法定义了两个类型
第一个是typedef struct _TreeNode TreeNode 树的节点类型
第二个是typedef struct _TreeNode * TreeNodePointer 树的指针类型

定义了一个结构体
typedef struct _TreeNode{
int data;
struct _TreeNode * leftchild;
struct _TreeNode * rightchild;
};
重命名 typedef struct _TreeNode TreeNode
定义一个指针类型 typedef struct _TreeNode * TreeNodePointer
注意:struct _TreeNode *这才是指针类型,TreeNodePointer是类型的名字
*/

void Test1(){
    //定义结构体对象
    TreeNode t1, t2, t3, t4, t5;
    //填充数据域
    t1.data = 1;
    t2.data = 2;
    t3.data = 3;
    t4.data = 4;
    t5.data = 5;

    //建立树之间的关系
    //t1是根节点  t2是t1的左孩子
    t1.leftchild = &t2;
    t1.rightchild = NULL;

    // t3是t2的左孩子
    t2.leftchild = &t3;
    t2.rightchild = NULL;

    // t4是t2的左孩子
    t3.leftchild = &t4;
    t3.rightchild = NULL;

    // t5是t4的左孩子
    t4.leftchild = &t5;
    t4.rightchild = NULL;

    //t5没有孩子节点
    t5.leftchild = NULL;
    t5.rightchild = NULL;
}

void Test2(){
    //定义结构体对象
    TreeNodePointer t1 = NULL, t2 = NULL, t3 = NULL, t4 = NULL, t5 = NULL;
    t1 = (TreeNodePointer)malloc(sizeof(TreeNode));
    if (t1==NULL)
    {
        printf("分配内存失败!");
        goto END;
    }
    //初始化数据
    memset(t1, 0, sizeof(TreeNode));
    t2 = (TreeNodePointer)malloc(sizeof(TreeNode));
    if (t2 == NULL)
    {
        printf("分配内存失败!");
        goto END;
    }
    //初始化数据
    memset(t2, 0, sizeof(TreeNode));
    t3= (TreeNodePointer)malloc(sizeof(TreeNode));
    if (t3 == NULL)
    {
        printf("分配内存失败!");
        goto END;
    }
    //初始化数据
    memset(t3, 0, sizeof(TreeNode));
    t4 = (TreeNodePointer)malloc(sizeof(TreeNode));
    if (t4 == NULL)
    {
        printf("分配内存失败!");
        goto END;
    }
    //初始化数据
    memset(t4, 0, sizeof(TreeNode));
    t5 = (TreeNodePointer)malloc(sizeof(TreeNode));
    if (t5 == NULL)
    {
        printf("分配内存失败!");
        goto END;
    }
    //初始化数据
    memset(t5, 0, sizeof(TreeNode));
    //填充数据域
    t1->data = 1;
    t2->data = 2;
    t3->data = 3;
    t4->data = 4;
    t5->data = 5;

    //建立树之间的关系
    //t1是根节点  t2是t1的左孩子
    t1->leftchild = t2;
    t1->rightchild = NULL;

    // t3是t2的左孩子
    t2->leftchild = t3;
    t2->rightchild = NULL;

    // t4是t2的左孩子
    t3->leftchild = t4;
    t3->rightchild = NULL;

    // t5是t4的左孩子
    t4->leftchild = t5;
    t4->rightchild = NULL;

    //t5没有孩子节点
    t5->leftchild = NULL;
    t5->rightchild = NULL;

END:
    if (t1!=NULL)
    {
        free(t1);
        t1 = NULL;
    }
    if (t2 != NULL)
    {
        free(t2);
        t2 = NULL;
    }
    if (t3 != NULL)
    {
        free(t3);
        t3 = NULL;
    }
    if (t4 != NULL)
    {
        free(t4);
        t4 = NULL;
    }
    if (t5 != NULL)
    {
        free(t5);
        t5 = NULL;
    }
}

void main(){

    system("pause");
}

时间: 2024-10-25 00:49:49

数据结构 树的链式存储(二叉表示法)的相关文章

数据结构 树的链式存储(三叉表示法)

//树的链式存储--三叉表示法 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct _TreeNode{ //数据域 int data; //指针域 struct _TreeNode * leftchild;//左孩子指针 struct _TreeNode * rightchild;//右孩子指针 struct _TreeNode * parent;//双亲指针---比二叉表示法多

数据结构 树的链式存储(双亲表示法)

//树的链式存储--双亲表示法 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_TREE_SIZE 100 typedef struct BPTNode { char data;//数据域 int parentPosition; //双亲的数组下标 char LRTag; //左右孩子标志域 }BPTNode; typedef struct BPTree { BPTNode node

浅谈数据结构之线性表链式存储(二)

前面我们所讲的线性表的顺序存储结构,它是有优缺点,最大的缺点是插入与删除时需移动大量的元素,这显然需要耗费许多时间.这时,我们就引入线性表的链式存储结构,它的特点是:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.这就意味着,这些数据可以存在内存中未被占用的任意位置上,即当线性表进行插入与删除时就不需要移动大量的元素了,节约了时间. 链式结构中,除了需要存储数据元素的信息外,还要存储它的后继元素的存储地址.我们把存储数据元素信息的域称为数据域,把存储直接后继

数据结构-线性表-链式存储

由于顺序表的插入.删除操作需要移动大量的元素,影响了运行效率,由此引入了线性表的链式存储. 链式存储线性表时,不需要使用地址连续的存储单元,即它不要求逻辑上相邻的两个元素在物理位置上也相邻,它是通过“链”建立起数据元素之间的逻辑关系. 因此,对线性表的插入.删除不需要移动元素,而只需要修改指针. 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后继的指针.单链表结

数据结构-队列-顺序链式存储

定义 队列(Queue):队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除.向队列中插入元素称为入队或进队:删除元素称为出队或离队. 队列的操作 队列不可以读取对中间的元素. 队列的存储结构 顺序存储 链式存储 顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front 和rear分别指示队头元素和队尾元素的位置. 设队头指针指向队头元素,队尾指针指向队尾 元素的下一个位置(也可以让rear指向队尾元素,front指向队头元

数据结构 - 栈的链式存储

栈的链式存储 1 栈的链式表示 栈的链式存储结构称为链栈,是运算受限的单链表.其插入和删除操作只能在表头位置上进行.因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针.图3-4是栈的链式存储表示形式. 链栈的结点类型说明如下: typedef struct Snode { ElemType data ; struct Snode *next ; } SNode, *Link_Stack ; 链栈基本操作的实现 2 链栈基本操作的实现 (1) 栈的初始化 SNode *Ini

数据结构之队列——链式存储结构(php代码实现)

<?php class QNode{     public  $data;     public  $next;     public function __construct($data){         $this->data=$data;         $this->next=null;     } } class LinkQueue{ //链队列包含头结点,实例化时,此队列为空     private $data;     private $next;     private

大话数据结构——线性表-链式存储之删除整链表

#include<iostream> #include<time.h> #include <stdlib.h> using namespace std; #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 typedef int status;//返回的状态值 typedef int elemtype;//节点里数据的类型 //数据结构 typedef struct Node { elemtype da

大话数据结构——线性表-链式存储之头插法创建链表

1 #include<iostream> 2 3 #include<time.h> 4 #include <stdlib.h> 5 6 using namespace std; 7 8 #define OK 1 9 #define TRUE 1 10 #define FALSE 0 11 #define ERROR 0 12 13 typedef int status;//返回的状态值 14 typedef int elemtype;//节点里数据的类型 15 16 /