【數(shù)據(jù)結(jié)構(gòu)】廣義表的默認(rèn)成員函數(shù)、深度、大小、打印-創(chuàng)新互聯(lián)

廣義表的定義:

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到扶綏網(wǎng)站設(shè)計(jì)與扶綏網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋扶綏地區(qū)。

廣義表是非線(xiàn)性的結(jié)構(gòu),是n個(gè)元素的有限序列。

【數(shù)據(jù)結(jié)構(gòu)】廣義表的默認(rèn)成員函數(shù)、深度、大小、打印

舉例:A=(a,b,(c,d))

我們先定義它的結(jié)構(gòu):

(1)它有三種節(jié)點(diǎn),頭節(jié)點(diǎn)、值節(jié)點(diǎn)、子表節(jié)點(diǎn)。

(2)兩種指向下一節(jié)點(diǎn)的指針:指向下一值值節(jié)點(diǎn)的指針_next,指向子表節(jié)點(diǎn)的指針_sublink.

enum Type//用枚舉形式來(lái)定義廣義表中三種節(jié)點(diǎn)類(lèi)型
{
    HEAD, //頭類(lèi)型
    VALUE,//值類(lèi)型
    SUB,//子表類(lèi)型
};

struct GeneralizedNode
{
    Type _type;//類(lèi)型
    GeneralizedNode* _next;//指向下一節(jié)點(diǎn)的指針
    union
    {
        int _value;//一個(gè)節(jié)點(diǎn)下一節(jié)點(diǎn)可能是值節(jié)點(diǎn),也可能是子表節(jié)點(diǎn)
        GeneralizedNode* _sublink;
    }; 

    GeneralizedNode(Type type)
        :_next(NULL)
        , _type(type)
    {}
    
    GeneralizedNode(Type type,int value)
        :_next(NULL)
        , _type(type)
        , _value(value)
        {}
};

下面,我們來(lái)看下實(shí)現(xiàn)的代碼:

class Generalized
{
public:
    Generalized()
        :_head(NULL)
    {}

    Generalized(const char* str)
    {
        _head = _CreateList(str);//調(diào)用函數(shù)創(chuàng)建節(jié)點(diǎn)
    }

    Generalized(const Generalized& gr)
    {
        _head = _Copy(gr._head);//調(diào)用函數(shù)拷貝節(jié)點(diǎn)
    }

    Generalized& operator=(const Generalized& gr)
    {
        if (&gr != this)
        {
            _Copy(gr._head);
            _Destroy(_head);
        }
        return *this;
    }

    ~Generalized()
    {
        _Destroy(_head);
    }

    void Print()
    {
        _Print(_head);
    }

    size_t Size()
    {
        return _Size(_head);
    }

    size_t Depth()
    {
        return _Depth(_head);
    }

protected:
    //拷貝廣義表
    GeneralizedNode* _Copy(GeneralizedNode* grhead)
    {
        GeneralizedNode* grcur = grhead;

        GeneralizedNode* newHead = new GeneralizedNode(HEAD);
        GeneralizedNode* newcur = newHead;

        while (grcur)
        {
            if (grcur->_type == VALUE)
            {
                GeneralizedNode* tmp = new GeneralizedNode(VALUE);
                newcur->_next = tmp;
                newcur = newcur->_next;
                newcur->_value = grcur->_value;
            }
            
            else if (grcur->_type == SUB)
            {
                GeneralizedNode* tmp = new GeneralizedNode(SUB);
                newcur->_next = tmp;
                newcur = newcur->_next;
                newcur->_sublink = _Copy(grcur->_sublink);
            }
            grcur = grcur->_next;
        }
        newcur = NULL;
        return newHead;
    }

    //釋放廣義表
    void _Destroy(GeneralizedNode* head)
    {
        GeneralizedNode* cur = head;
        while (cur)
        {
            GeneralizedNode* del = cur;
            cur = cur->_next;
            if (del->_type == SUB)
            {
                _Destroy(del->_sublink);
            }
            else
            {
                delete del;
                del = NULL;
            }
        }
    }

    //打印
    void _Print(GeneralizedNode* head)
    {    
        GeneralizedNode* cur = head;
        while (cur)
        {
            if (cur->_type == HEAD)
            {
                cout << "(";
            }
            else if (cur->_type == VALUE)
            {
                cout << (char)(cur->_value);
                if (cur->_next)
                {
                    cout << ",";
                }
            }
            else if (cur->_type == SUB)
            {
                _Print(cur->_sublink);
                if (cur->_next)
                {
                    cout << ",";
                }
            }
            cur = cur->_next;
        }
        cout << ")";        
    }

    //判斷是否是值
    bool _IsValue(const char* str)
    {
        if (*str > 0 && *str<9
            || *str>'a' && *str<'z'
            || *str>'A' && *str < 'Z')
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    //創(chuàng)建節(jié)點(diǎn)
    GeneralizedNode* _CreateList(const char* str)
    {
        assert(*str=='(');
        ++str;
        GeneralizedNode* head = new GeneralizedNode(HEAD);
        GeneralizedNode* cur = head;
        while (cur)
        {
            if (_IsValue(str))
            {
                 cur->_next = new GeneralizedNode(VALUE,*str);
                cur = cur->_next;
                str++;
            }
            else if (*str == '(')
            {
                GeneralizedNode* SubNode = new GeneralizedNode(SUB);
                cur->_next = SubNode;
                cur = cur->_next;
                SubNode->_sublink = _CreateList(str);
                str++;
            }
            else if (*str == ')')
            {
                str++;
                return head;
            }
            else
            {
                str++;
            }
        }
        cout << "廣義表出錯(cuò)!" << endl;
        assert(false);
        return head;
    }

    //大?。ㄖ倒?jié)點(diǎn)數(shù))
    size_t _Size(GeneralizedNode* head)
    {
        GeneralizedNode* cur = head;
        size_t size = 0;
        while (cur)
        {
            if (cur->_type == VALUE)
            {
                size++;
            }
            else if (cur->_type == SUB)
            {
                size += _Size(cur->_sublink);
            }
            cur = cur->_next;
        }
        return size;
    }

    //深度
    size_t _Depth(GeneralizedNode* head)
    {
        size_t depth = 1;
        GeneralizedNode* cur = head;
        while (cur)
        {
            if (cur->_type == SUB)
            {
                size_t curdepth = _Depth(cur->_sublink);
    
                if (curdepth + 1 > depth)
                {
                    depth = curdepth + 1;
                }
            }
            cur = cur->_next;
        }
        return depth;
    }

private:
    GeneralizedNode* _head;
};

void Test()
{
    Generalized gr1("()");
    Generalized gr2("(a,b,(c,d))");
    Generalized gr3("(a,b,(c,(d),e))");
    Generalized gr4(gr3);
    gr1.Print();
    cout << endl;
    gr2.Print();
    cout << endl;

    gr3.Print();
    cout << endl;

    gr4.Print();
    cout << endl;

    size_t size = gr4.Size();
    cout << "gr4大?。?<<size << endl;
    int depth = gr4.Depth();
    cout << "gr4深度:" << depth << endl;
}

int main()
{
    Test();
    system("pause");
    return 0;
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞標(biāo)題:【數(shù)據(jù)結(jié)構(gòu)】廣義表的默認(rèn)成員函數(shù)、深度、大小、打印-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://muchs.cn/article36/dpjspg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站導(dǎo)航、網(wǎng)站改版、服務(wù)器托管、靜態(tài)網(wǎng)站自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化