博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单的广义表实现
阅读量:5845 次
发布时间:2019-06-18

本文共 4132 字,大约阅读时间需要 13 分钟。

hot3.png

#ifndef GLLIST_H#define GLLIST_Hstruct GLNode{    bool isNum;    union {        int data;        struct {            GLNode* hp,*tp;        };    };};class GLlist{    private:        GLNode* pNode;        GLNode* init_GLNode(int);        GLNode* init_GLNode();        unsigned travel_depth(GLNode*);        void travel_input(GLNode**);        void travel_output(GLNode*);        GLlist(GLNode*);        void destory(GLNode*);    public:        GLlist();        ~GLlist();        void input();        void output();        GLNode* getHead();        GLlist getTail();        unsigned depth();        unsigned length();};
//all this definitions is just used to be a sign#define PRIVATE#define PUBLIC#include "GLlist.h"#include
using namespace std;PRIVATE GLNode* GLlist::init_GLNode(int element){    GLNode* temp=new GLNode;    temp->isNum=1;    temp->data=element;    return temp;}PRIVATE GLNode* GLlist::init_GLNode(){    GLNode* temp=new GLNode;    temp->isNum=0;    temp->hp=temp->tp=0;    return temp;}PRIVATE GLlist::GLlist(GLNode* p):pNode(p){}PRIVATE unsigned GLlist::travel_depth(GLNode* p){    unsigned dep=1,max=1;    while(p!=0){        if(p->isNum==0&&p->hp!=0&&p->hp->isNum==0){            if((dep=travel_depth(p->hp)+1)>max)                max=dep;        }        p=p->tp;    }    return max;}PRIVATE void GLlist::destory(GLNode* p){    while(p!=0){        if(p->isNum==0&&p->hp!=0&&p->hp->isNum==1)            delete p->hp;        else if(p->isNum==0&&p->hp!=0&&p->hp->isNum==0)            destory(p->hp);        GLNode* temp;        temp=p;        p=p->tp;        delete temp;    }}PRIVATE void GLlist::travel_output(GLNode* p){    cout<<'(';    while(p!=0){        if(p->isNum==0&&p->hp!=0&&p->hp->isNum==0)            travel_output(p->hp);        else if(p->isNum==0&&p->hp!=0&&p->hp->isNum==1)            cout<
hp->data;        else            break;        if(p->tp!=0)            cout<<',';        p=p->tp;    }    cout<<')';}//TODO: reconstruct it!//must use point**, because you will change the value of pointPRIVATE void GLlist::travel_input(GLNode** p){    char ch;    int data;    cin.get(ch);//skip the first '('    while(cin.get(ch)){        /*         *iterate the main GLlist,         *if there is a sub GLlist,         *then recurrent the function        */        if(ch==',')//skip comma            continue;        switch(ch){//aumatic computability        case '('://create the sub GLlist            cin.putback(ch);            //you must putback '(',for you will skip it next            *p=init_GLNode();            (*p)->hp=init_GLNode();            travel_input(&(*p)->hp);            break;        //if ch is a num, just putback it to the input stream, then use cin        case '0': case '1': case '2': case '3': case '4':        case '5': case '6': case '7': case '8': case '9':            cin.putback(ch);            cin>>data;            *p=init_GLNode();            (*p)->hp=init_GLNode(data);            break;        case ')':            return;        }        p=&(*p)->tp;    }}PUBLIC GLlist::GLlist():pNode(0){}PUBLIC GLlist::~GLlist(){    if(pNode!=0){        destory(pNode);    }}PUBLIC void GLlist::input(){    travel_input(&pNode);    if(pNode==0)        //if the input is "()",just give pNode an empty GLNode        //TODO: reconstruct it, it a poor idea        pNode=init_GLNode();}PUBLIC void GLlist::output(){    if(pNode==0)        cout<<"Not A GLlist!"<
hp;}PUBLIC GLlist GLlist::getTail(){    if(pNode==0){        cerr<<"ERROR: empty GLlist!\n";        return 0;    }    GLlist temp;    temp.pNode=pNode->tp;    if(temp.pNode==0)        temp.pNode=init_GLNode();    return temp;}PUBLIC unsigned GLlist::depth(){    if(pNode==0){        cerr<<"ERROR: empty GLlist!\n";        return 0;    }    return travel_depth(pNode);}PUBLIC unsigned GLlist::length(){    if(pNode==0){        cerr<<"ERROR: empty GLlist!\n";        return 0;    }    GLNode* p=pNode;    unsigned count=0;    while(p!=0){        if(p->isNum==0&&p->hp!=0)            ++count;        p=p->tp;    }    return count;}

转载于:https://my.oschina.net/codesun/blog/96087

你可能感兴趣的文章
Vue全家桶+Socket.io+Express/Koa2打造网页版手机QQ
查看>>
docker运行mywebsql
查看>>
spread operator in es6
查看>>
Font-End_面试题
查看>>
Rax 0.3 介绍
查看>>
使用 express 轻松实现反向代理服务器
查看>>
再探Watson服务(二)
查看>>
connect to host ssh.github.com port 22: Connection timed out解决方法
查看>>
AsyncTask 用 publishProgress 遇到的坑
查看>>
[LeetCode] Clone Graph
查看>>
APICloud案例源码、模块源码、考试源码、开发工具大集合!赶快收藏
查看>>
保护 Equatable 的实现
查看>>
京东购物在微信等场景下的算法应用实践
查看>>
Chef宣布100%开源,要走红帽模式?\n
查看>>
“迁移策略+新容器运行时”应对有状态应用的冷热迁移挑战
查看>>
利用人工智能提升团队包容性
查看>>
Oracle发布多语种虚拟机平台GraalVM 1.0
查看>>
Gil Zilberfeld问答:敏捷产品的规划与管理
查看>>
Lisk沙箱漏洞分析及解决方案
查看>>
Qt 工程管理
查看>>