鱼C论坛

 找回密码
 立即注册
查看: 1698|回复: 7

混乱了,结构体的指针变量,指针参数

[复制链接]
发表于 2014-4-29 17:33:28 | 显示全部楼层 |阅读模式
5鱼币
#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;

// 线索存储标志位
// Link(0):表示指向左右孩子的指针
// Thread(1):表示指向前驱后继的线索
typedef enum {Link, Thread} PointerTag;

typedef struct BiThrNode
{
    char data;
    struct BiThrNode *lchild, *rchild;
    PointerTag ltag;
    PointerTag rtag;
} BiThrNode, *BiThrTree;

// 全局变量,始终指向刚刚访问过的结点
BiThrTree pre;

// 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据
void CreateBiThrTree( BiThrTree *T )
{
    char c;

    scanf("%c", &c);
    if( ' ' == c )
    {
        *T = NULL;
    }
    else
    {
        *T = (BiThrNode *)malloc(sizeof(BiThrNode));
        (*T)->data = c;
        (*T)->ltag = Link;
        (*T)->rtag = Link;

        CreateBiThrTree(&(*T)->lchild);
        CreateBiThrTree(&(*T)->rchild);
    }
}

// 中序遍历线索化
void InThreading(BiThrTree T)
{
    if( T )
    {
        InThreading( T->lchild );        // 递归左孩子线索化

        if( !T->lchild )    // 如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点。
        {
            T->ltag = Thread;
            T->lchild = pre;
        }

        if( !pre->rchild )
        {
            pre->rtag = Thread;
            pre->rchild = T;
        }

        pre = T;

        InThreading( T->rchild );        // 递归右孩子线索化
    }
}

void InOrderThreading( BiThrTree *p, BiThrTree T )
{
    *p = (BiThrTree)malloc(sizeof(BiThrNode));
    (*p)->ltag = Link;
    (*p)->rtag = Thread;
    (*p)->rchild = *p;
    if( !T )
    {
        (*p)->lchild = *p;
    }
    else
    {
        (*p)->lchild = T;
        pre = *p;
        InThreading(T);
        pre->rchild = *p;
        pre->rtag = Thread;
        (*p)->rchild = pre;
    }
}

void visit( char c )
{
    printf("%c", c);
}

// 中序遍历二叉树,非递归
void InOrderTraverse( BiThrTree T )
{
    BiThrTree p;
    p = T->lchild;

    while( p != T )
    {
        while( p->ltag == Link )
        {
            p = p->lchild;
        }
        visit(p->data);

        while( p->rtag == Thread && p->rchild != T )
        {
            p = p->rchild;
            visit(p->data);
        }
        
        p = p->rchild;
    }
}

int main()
{
    BiThrTree P, T = NULL;

    CreateBiThrTree( &T );

    InOrderThreading( &P, T );

    printf("中序遍历输出结果为: ");

    InOrderTraverse( P );

    printf("\n");

    return 0;
}


请教一下:红色处为什么这样传参,混乱了,谁给我透彻的讲讲(对于基本的指针,我还是能理解的,但是这地方有点不懂)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 18:51:08 | 显示全部楼层
一个BiThrNode结构体为一个结点

BiThrTree *p 是指向结构体指针的指针 是指向树的指针
BiThrTree  p 是指向树的第一个结点的指针 是树的头指针 可以用来代表树

用第一种方法作为形参的目的是可以修改树的内容。

评分

参与人数 1鱼币 +3 贡献 +2 收起 理由
码农 + 3 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-30 09:13:00 | 显示全部楼层
BiThrTree *p, BiThrTree T,
前一个时指向指针的指针,用于引用或修改该指针指向的指针的值(也就是它指向的内容)
后一个时指针,用于引用或修改指针的值(也就是它指向的内容)
总之一句话,针对的对象不同,要修改指针的内容,使用指针指向的指针,修改内容,使用指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-30 15:30:17 | 显示全部楼层

BiThrTree *p, BiThrTree T
BiThrTree *p,是BiThrTree 类型的指针
BiThrTree T 是BiThrTree 类型
而BiThrTree 你定义是typedef struct BiThrNode{};BiThrNode, *BiThrTree;
BiThrTree 就相当于struct BiThrNode*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-30 17:03:30 | 显示全部楼层

我怎么觉得第二种方法作为形参也可以修改树的内容,只是无法改变这棵树在内存的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-30 22:34:18 | 显示全部楼层
码农 发表于 2014-4-30 17:03
我怎么觉得第二种方法作为形参也可以修改树的内容,只是无法改变这棵树在内存的地址

     我当时也对这玩意混乱了,我的方法是在用 BiThrTree *p 的地方用 BiThrTree p 替换,试着试着就懂了,在下用言语确实无法说得太清楚,重在实践领悟。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-15 10:51:17 | 显示全部楼层
sidfate 发表于 2014-4-29 18:51
一个BiThrNode结构体为一个结点

BiThrTree *p 是指向结构体指针的指针 是指向树的指针

太长了,看不下去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-10 12:01:25 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 05:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表