亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? treeop.cpp

?? 參照網上的例子改寫的多叉樹的讀寫程序
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/********************************************************
     文 件 名: tree.c
     所屬項目: 
     編寫單位: 
     作    者: 易劍
     編寫日期: 2003-02-10
     版    本: 
     功能描述: 操作配置文件的樹結構及其算法
     修改日志: 
     修改時間: 
       修 改 者: 
    修改內容: 
*********************************************************/









#include "treeOp.h"

//#include "private_tree.h"
#include "parse_cfgfile.h"


//#include "misc.h"


//#include "queue.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mystack.h"




/*
    ===============================================================
    函數實現處
    ===============================================================
*/


/********************************************************
     函 數 名稱:init_cfg
     功能描述:初始化配置文件
     參數說明:
        cfg_filepath,配置文件
        task_filepath,任務文件
        argv,命令行參數
        direct,裝載行為
     返 回 值:成功返回樹根結點的指針,否則返回 NULL
*********************************************************/
struct tree_node *init_cfg(char *cfg_filepath, char *task_filepath, char **argv, char *direct)
{
    struct tree_node *root            = NULL;
    struct tree_node *defaultnode    = NULL;
    
    /* 1、建立樹根結點 */
    root = create_treeroot("root");
    if (NULL == root)
        return NULL;

#define _DEBUG_ 
#ifdef _DEBUG_
    createtree_fromfile(cfg_filepath, &root);
    return root;
    
#endif /* _DEBUG_ */


    /* 2、建立 [DEFAULT] 結點 */
    defaultnode = (struct tree_node *)malloc(sizeof(struct tree_node));
    if (NULL == defaultnode)
    {
        free(root);
        root = NULL;

        return NULL;
    }
    memset(defaultnode, NULL, sizeof(struct tree_node));
    strcpy(defaultnode->data, "DEFAULT");
    defaultnode->flag = 1;

    insertnode_byparent(root, defaultnode);

    /* 載入環境變量到以 defaultnode 為父結點的子樹中 */
    if (direct[0] == 1)
    {
        ;//load_envvar(&defaultnode);
    }

    /* 載入配置文件 [DEFAULT] 段
        到以 defaultnode 為父結點的子樹中 ,
        并覆蓋上一步載入的環境變量
    */
    if (direct[1] == 1)
    {
        ;//load_cfgndvar(&defaultnode, cfg_filepath);
    }    

    /* 載入任務文件 [DEFAULT] 段到以 defaultnode 為父結點的子樹中 */
    if (direct[3] == 1)
    {
        ;//load_taskdvar(&defaultnode, task_filepath);
    }

    /* 載入命令行到以 defaultnode 為父結點的子樹中 */
    if (direct[4] == 1)
    {
        ;//load_cmdvar(&defaultnode, argv);
    }

    /*
        構建 defaultnode 結點的兄弟結點
    */
    /* 載入配置文件[DEFAULT] 段以外的參數,
       構建與 defaultnode 結點并列的結點 */
    if (direct[2] == 1)
    {
        load_cfgndvar(&root, cfg_filepath);
    }

    return root;
}

/********************************************************
     函 數 名稱:uninit
     功能描述:釋放樹結點
     參數說明:
        root,樹根
     返 回 值:無
*********************************************************/
void uninit(struct tree_node *root)
{
    struct tree_node *child         = NULL;
    struct tree_node *sibling     = NULL;
    struct tree_node *nextsibling     = NULL;

    /* 樹根不存在或不是樹根時 */
    if ((NULL == root))
        return;

    child = root->firstchild;
    if (NULL != child)
    {
        sibling = child->nextsibling;

        /* 如果是葉子結點或是空子樹時 */
        if ((child->flag == 0) || (child->firstchild == NULL))
        {
            free(child);
            child = NULL;
        }
        else
        {
            uninit(child);
            child = NULL;
        }

        do
        {        
            if (NULL != sibling)
            {
                nextsibling = sibling->nextsibling;

                if ((sibling->flag == 0) || (sibling->firstchild == NULL))
                {
                    free(sibling);
                    sibling = NULL;
                }
                else
                {                    
                    uninit(sibling);                    
                    sibling = NULL;
                }
                
                sibling = nextsibling->nextsibling;
            }                    
        } while (NULL != sibling);
    }

    /* 釋放根結點 */
    free(root);
    root = NULL;
}

/********************************************************
     函 數 名稱:createtree_fromfile
     功能描述:從文件中獲取數據創建以為 root 根的樹
     參數說明:
        filename,存儲有樹結構數據的文件的文件名
        root,樹根
     返 回 值:無
*********************************************************/
void createtree_fromfile(char *filename, struct tree_node **root)
{
    FILE *fp = NULL;
    struct mystack s;

    if ((NULL == filename) || (*root == NULL))
        return;

    fp = fopen(filename, "r");
    if (NULL == fp)
        return;

    init_stack(&s);
    push_stack(&s, *root); /* 必須 */


    read_fromcfgfile(fp, root, &s);

    fclose(fp);
}

/********************************************************
     函 數 名稱:createtree_fromfilefp
     功能描述:從文件中獲取數據創建以為 root 根的樹
     參數說明:
        fp,存儲有樹結構數據的文件的文件描述符
        root,樹根
     返 回 值:無
*********************************************************/
void createtree_fromfilefp(FILE *fp, struct tree_node **root)
{
    struct mystack s;

    if ((NULL == fp) || (*root == NULL))
        return;

    init_stack(&s);
    push_stack(&s, *root); /* 必須 */

    read_fromcfgfile(fp, root, &s);    
}

/********************************************************
     函 數 名 稱:dump_tree  
     功能描述:將根為 root 的樹的子樹(根為 path 對應的結點)導出到文件 result_filepath 中
     參數說明:
        root,樹根
        path,路徑,如果 path 為 NULL則將整個樹導出
        result_filepath,導出文件
     返 回 值:成功返回 1,失敗返回 -1
*********************************************************/
int dump_tree(struct tree_node *root, const char *result_filepath, const char *path)
{
    FILE *fp                    = NULL;
    struct tree_node *subroot    = NULL;    /* 路徑 path 對應的結點 */

    if ((NULL == root) || (NULL == result_filepath))
        return -1;

    if (NULL != path)
    {    
        subroot = get_node(root, path);
        if (subroot == NULL)
            return -1;
    }
    else
    {
        subroot = root;
    }

    fp = fopen(result_filepath, "w");
    if (NULL == fp)    
        return -1;
    
    recursion_dump(subroot, fp)    ;

    fclose(fp);

    return 1;
}

/********************************************************
  函 數 名:get_value
  功能描述:得到 path 對應的結點的 value 域值;
            如果該結點為內部結點,
            則得到第一個類型為 flag 的子結點的路徑
  參數說明:
      root,樹根
      path,路徑
      flag,如果返回是下一個并列結點的路徑,則 flag 的返回值為 8
  返 回 值:成功返回得到的子結點路徑或 value域值,失敗返回 NULL
*********************************************************/
char *get_value(struct tree_node *root, const char *path, int *flag)
{
    struct tree_node *node = NULL;        /* 目標結點 */
    struct tree_node *firstchild = NULL;/* 目標結點的第一個孩子 */
    struct tree_node *sibling = NULL;   /* 目標孩子的其它孩子 */
    char *value = NULL;
    int valuelen = 0;

    if ((NULL == root) || (NULL == path) || (NULL == flag))
        return NULL;

    node  = get_node(root, path);
    if (NULL == node)
        return NULL;

    if (node->flag == NODE_IS_LEAF)                /* 是葉子 */
    {
        value = (char *)malloc(strlen(node->data)+1);
        if (NULL == value)
            return NULL;

        strcpy(value, node->data);

        return value;
    }
    else if (node->flag == NODE_IS_BRANCH)            /* 是樹枝 */
    {
        firstchild = node->firstchild;
        if (firstchild != NULL)
        {
            if (firstchild->flag == *flag)
            {
                /* 別忘記了路徑之間要用 ":" 隔開,故要加 2 */
                valuelen = strlen(path)+strlen(firstchild->data)+2;
                value = (char *)malloc(valuelen);
                if (NULL == value)
                    return NULL;

                memset(value, '\0', valuelen);
                strcpy(value, path);
                strcat(value, ":");
                strcat(value, firstchild->data);

                *flag = 8;
                return value;
            }
            else    /* 從其它兄弟中尋找 */
            {
                sibling = firstchild->nextsibling;
                while (sibling != NULL)
                {
                    if (sibling->flag == *flag)
                    {
                        /* 別忘記了路徑之間要用 ":" 隔開,故要加 2 */
                        valuelen = strlen(path)+strlen(sibling->data)+2;
                        value = (char *)malloc(valuelen);
                        if (NULL == value)
                            return NULL;

                        memset(value, '\0', valuelen);
                        strcpy(value, path);
                        strcat(value, ":");
                        strcat(value, sibling->data);

                        *flag = 8;
                        return value;
                    }

                    sibling = sibling->nextsibling;
                }
            }
        }
    }

    return NULL;
}

/********************************************************
     函 數 名:node_is_exist
     功能描述:判斷路徑是否是合法路徑
     參數說明:
        root,樹根
        path,待判斷的路徑
     返 回 值:成功返回1,失敗返回-1
*********************************************************/
int node_is_exist(struct tree_node *root, const char *path)
{
    char *value = NULL;
    int flag = NODE_IS_LEAF;
    
    value = get_value(root, path, &flag);
    if ((NULL != value) && (NEXT_NODE_EXIST != flag))
        return 1;
    else
        return -1;
}
/********************************************************
     函 數 名:get_next_path     功能描述:得到與 path 并列的下一類型為 flag 的路徑
     參數說明:
        root,樹根
        path,路徑
     返 回 值:成功返回得到的路徑,失敗返回 NULL
*********************************************************/
char *get_next_path(struct tree_node *root, const char *path, int flag)
{
    struct tree_node *node = NULL;        /* 結點 */    
    struct tree_node *sibling = NULL;   /* 兄弟結點 */

    char *nextpath    = NULL;
    int nextpathlen    = 0;
    int pathlen        = 0;
    int len            = 0;

    if ((NULL == root) || (NULL == path))
        return NULL;

    node  = get_node(root, path);
    if (NULL == node)                    /* 路徑為 path 的結點不存在 */
        return NULL;

    sibling = node->nextsibling;
    while (sibling != NULL)
    {
        if (sibling->flag == flag)
        {
            len = strlen(node->data);
            pathlen = strlen(path);
            nextpathlen = pathlen - len + strlen(sibling->data) + 1;
            nextpath = (char *)malloc(nextpathlen);
            if (nextpath == NULL)
                return NULL;
            
            memset(nextpath, NULL, nextpathlen);
            strncpy(nextpath, path, pathlen-len);
            strcat(nextpath, sibling->data);

            return nextpath;
        }

        sibling = sibling->nextsibling;
    }

    return NULL;
}

/********************************************************
     函 數 名:get_next_path2
     功能描述:得到下一個并列結點的路徑和結點類型
     參數說明:
        root,樹根
        path,路徑
        flag,輸出參數,下一結點的類型
     返 回 值:成功返回得到的路徑,失敗返回 NULL
*********************************************************/
char *get_next_path2(struct tree_node *root, const char *path, int *flag)
{
    struct tree_node *node = NULL;        /* 結點 */    
    struct tree_node *sibling = NULL;   /* 兄弟結點 */

    char *nextpath    = NULL;
    int nextpathlen    = 0;
    int pathlen        = 0;
    int len            = 0;

    if ((NULL == root) || (NULL == path) || (NULL == flag))
        return NULL;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区日韩视频| 久久青草国产手机看片福利盒子 | 3d成人h动漫网站入口| 欧美变态口味重另类| 亚洲视频 欧洲视频| 久久 天天综合| 欧美日韩三级在线| 亚洲色图一区二区三区| 国产精品影视在线观看| 欧美一卡二卡在线| 亚洲老司机在线| 国产999精品久久久久久绿帽| 欧美精品v国产精品v日韩精品| 国产精品色一区二区三区| 麻豆精品久久久| 制服丝袜亚洲色图| 亚洲一区在线播放| 91在线国内视频| 欧美国产精品劲爆| 国内精品久久久久影院薰衣草| 欧美久久一二三四区| 亚洲美女区一区| 一本色道亚洲精品aⅴ| 国产精品色在线| 成人激情小说网站| 国产日产亚洲精品系列| 久草这里只有精品视频| 日韩一区二区电影网| 日韩电影一区二区三区四区| 欧美图片一区二区三区| 亚洲午夜在线视频| 欧美色精品天天在线观看视频| 亚洲精品福利视频网站| 91国产成人在线| 一区二区三区四区中文字幕| 色哟哟国产精品免费观看| 自拍偷拍欧美激情| 色综合久久天天| 亚洲国产三级在线| 欧美人xxxx| 日韩二区在线观看| 欧美岛国在线观看| 国产成人午夜视频| 国产精品久久毛片a| 99re这里只有精品6| 亚洲综合色视频| 欧美日韩和欧美的一区二区| 日本女优在线视频一区二区 | 午夜视频一区二区三区| 欧美高清视频不卡网| 秋霞电影一区二区| 久久嫩草精品久久久久| 国产91丝袜在线播放| 中文字幕一区二区三区色视频| 99精品在线免费| 婷婷国产v国产偷v亚洲高清| 欧美大片一区二区| 成人黄页毛片网站| 91丨porny丨首页| 亚洲综合在线电影| 正在播放一区二区| 国产福利视频一区二区三区| 欧美一区二区三区男人的天堂| 午夜私人影院久久久久| 欧美成人精精品一区二区频| fc2成人免费人成在线观看播放| 亚洲婷婷综合久久一本伊一区| 色婷婷激情综合| 韩国成人福利片在线播放| 中文字幕+乱码+中文字幕一区| 日韩三级在线观看| 欧美一级视频精品观看| 欧美日韩中文另类| 在线观看不卡一区| 在线视频中文字幕一区二区| 日本电影欧美片| 99热这里都是精品| 色婷婷av久久久久久久| 在线精品视频一区二区| 一本久久a久久精品亚洲| 91免费国产在线| 91女神在线视频| 91久久精品日日躁夜夜躁欧美| 99久久免费精品| 91啪九色porn原创视频在线观看| 精品国产乱码久久久久久图片| 欧美成人艳星乳罩| 欧美成人女星排名| 欧美精品电影在线播放| 欧美日韩精品免费观看视频| 欧美精品v日韩精品v韩国精品v| 国产福利91精品| 欧美熟乱第一页| 国产激情一区二区三区| 欧美三级电影在线观看| 成人免费看黄yyy456| 成人av资源在线| 91丨porny丨中文| 成人性色生活片免费看爆迷你毛片| 欧美午夜精品理论片a级按摩| 在线国产电影不卡| 91麻豆国产福利精品| 亚洲天堂福利av| 99这里只有久久精品视频| 欧美一级二级在线观看| 国产精品高清亚洲| 亚洲一区视频在线| 久久综合久色欧美综合狠狠| 三级精品在线观看| 8x8x8国产精品| 欧美激情在线看| 成人福利电影精品一区二区在线观看| 视频一区国产视频| 久久久美女艺术照精彩视频福利播放| 秋霞电影网一区二区| 色婷婷激情久久| 午夜精品久久久| 国产精品一区二区三区网站| 一区二区三区不卡视频| 久久精品亚洲乱码伦伦中文| 精品一二线国产| 日韩欧美国产一区二区在线播放 | 成人欧美一区二区三区| 免费在线欧美视频| 国内精品国产三级国产a久久 | 91论坛在线播放| 亚洲欧美一区二区三区国产精品| 欧美日韩的一区二区| 91首页免费视频| 国产精品一卡二| 强制捆绑调教一区二区| 国产无一区二区| 日本高清视频一区二区| 日韩电影在线免费观看| 国产免费观看久久| 国产馆精品极品| 国产成人午夜视频| 亚洲精品成a人| 国产a视频精品免费观看| 亚洲另类一区二区| 天天av天天翘天天综合网 | 精品一区二区三区视频在线观看 | 日韩一区在线播放| 91.com在线观看| 欧美性生活影院| 欧美日精品一区视频| 成人动漫一区二区| 国产激情视频一区二区三区欧美 | 亚洲免费在线看| 亚洲韩国精品一区| 亚洲一区二区欧美| 日本欧洲一区二区| 99热99精品| 久久奇米777| 亚洲成av人片在线| 国产成人欧美日韩在线电影| 在线观看精品一区| 欧美美女一区二区在线观看| 日韩精品一区二区三区在线观看| 69p69国产精品| 日韩免费观看2025年上映的电影| 久久精品视频一区| 欧美日韩国产精选| 欧美三级在线播放| 午夜精品久久久久久久久久久 | 在线视频一区二区免费| 99v久久综合狠狠综合久久| 青草av.久久免费一区| 亚洲视频1区2区| av激情亚洲男人天堂| 中文字幕日本不卡| 91丝袜美腿高跟国产极品老师| 666欧美在线视频| 99久久免费视频.com| 欧美日韩国产综合久久| 69av一区二区三区| 亚洲高清不卡在线| 一区二区高清免费观看影视大全 | 久久一留热品黄| 欧美精品第1页| 日韩三级免费观看| 中文字幕免费在线观看视频一区| 18欧美乱大交hd1984| 婷婷综合在线观看| 精品一区二区三区影院在线午夜| 国产成人无遮挡在线视频| 色综合天天综合网天天看片| 日本久久电影网| 精品国产免费一区二区三区四区| 欧美日韩不卡一区二区| 蜜桃一区二区三区在线观看| 日本欧美在线观看| 精品久久久三级丝袜| 九九在线精品视频| eeuss鲁片一区二区三区在线看| 色综合久久久久久久| 欧美日韩1234| 国产精品久久午夜夜伦鲁鲁| 日韩高清国产一区在线| 午夜精品久久久久久|