核心思想: 1.节点类中用一个标志域区别是表还是元素 2.节点类中使用联合体 3.广义表类中存放一个起始指针
1.创建
1.两个函数的形式,详见代码注释 2.两次接受输入,方便递归,见注释 3.通过递归时传参传tlink ,hlink指针,后面函数直接用他们创造结点,巧妙避开结点连接问题 4.输入格式:空表用#表示,每个之间加逗号,用分号表示结束 例如:a,(#),b,c,(d,(e)); (如果觉得对输入要求过高,可以使用一个字符串保存输入,然后加一个处理函数,把其他格式的输入转化为此输入,函数中读输入时从该字符串中读即可)
#include<bits/stdc++.h>
using namespace std;
class node
{
int flag;
union
{
char data;
node* hlink;
};
node* tlink;
public:
friend class glist;
};
class glist
{
node* first;
public:
glist()
{
first = NULL;
}
void creat_glist()
{
creat_glist(first);
}
void creat_glist(node*& gs)
{
char a;
cin >> a;
if (a == '#')
{
gs = NULL;
}
else if(a=='(')
{
gs = new node;
gs->flag = 1;
creat_glist(gs->hlink);
}
else
{
gs = new node;
gs->flag = 0;
gs->data = a;
}
cin >> a;
if (gs == NULL);
else if (a == ',')
{
creat_glist(gs->tlink);
}
else if ((a == ')') || (a == ';'))
{
gs->tlink = NULL;
}
}
};
int main()
{
glist a;
a.creat_glist();
}
|