template <class T> void GenList<T>::CreateList(istream in, GenListNode<T> *&ls, SeqList<T>& L1, SeqList<GenListNode<T> *>& L2) { T chr; in >> chr; if (isalpha(chr) && isupper(chr) || chr == '(') { ls = new GenListNode<T>; ls->utype = 2; if (isalpha(chr) && isupper(chr)) { int n = L1.Length(); int m = L1.Search(chr); if (m != 0) { GenListNode<T> *p = L2.Locate(m); p->ref ++; } else { L1.Insert(n, chr); L2.Insert(n, ls); } in >> chr; if (chr != '(') { exit(1); } } ls->info.hlink = new GenListNode<T>; ls->info.hlink->utype = 0; ls->info.hlink->ref = 1; CreateList(in, ls->info.hlink->tlink, L1, L2); CreateList(in, ls, L1, L2); } else if (isalpha(chr) && islower(chr)) { ls = new GenListNode<T>; ls->utype = 1; ls->info.value = chr; CreateList(in, ls, L1, L2); } else if (chr == ',') { CreateList(in, ls->tlink, L1, L2); } else if (chr == ')') { ls->tlink = NULL; } else if (chr == '#') { ls == NULL; } };
|