|
阅读:853回复:0
[求助]帮忙弄弄显示部分
原题是这样的:假设广义表由原子元素,逗号,空格与圆括号组成,请写出可产生此广义表的链表表示的算法。
例如输入L = (a,(b,c))的情况,该算法产生的结果是: L->a->↓->^ b->c->^ 我试着编了一下,可是我想看看输出结果,就编了一个Display()函数,当输入为题设时,输出是 a->↓^ b->c->^ 我想把输出结果与题要求相同,怎么办?/ 下面是我的程序: #include<iostream.h> #include<string> #include<malloc.h> using namespace std; #define M 1000 /*广义表类型描述如下:*/ typedef struct node{ int flag; //标志位 union{ char data; //数据 struct node *pointer; //指向子表的指针 }info; struct node *link; //指向下一个结点的指针 }BSNode,*BSLinkList; /*假定输入序列存放在字符串*/ int CREAT(BSLinkList &Blist,string str) { BSLinkList STACK[M]; BSLinkList p; int top = -1; BSLinkList pre = Blist; int mark = 0; for(int i = 1;i<str.length() - 1;i++) { if(str == '(') { p = (BSLinkList)malloc(sizeof(BSNode)); p->link = NULL; p ->flag = 1; STACK[++top] = p; if(pre->flag == 1) { if(mark==0) //前一个符号不是')' pre->info.pointer = p; if(mark ==1) //')' {pre->link = p;mark = 0;} } if(pre->flag == 0) pre->link = p; pre = p; } if(isalpha(str)) { p = (BSLinkList)malloc(sizeof(BSNode)); p->flag = 0; p->link = NULL; p->info.data = str; if(pre->flag == 1) { if(mark==0) //前一个符号不是')' pre->info.pointer = p; if(mark ==1) //')' {pre->link = p;mark = 0;} } if(pre->flag == 0) pre->link = p; pre = p; } if(str==' ') // 是空格,前一个是'(' { p = (BSLinkList)malloc(sizeof(BSNode)); p->flag = 1; p->link = NULL; p->info.pointer = NULL; i++; if(str!=')') //下个符号不是')' return 0; if(pre->flag == 0) //前一个符号不能是原子符号 return 0; pre->info.pointer = p; pre = p; } if(str==')') { pre = STACK[top--]; mark = 1; } }//循环语句结束 if(top==-1) return 1; //左右括号匹配 return 0; } void Display(BSLinkList Blist) { BSLinkList QUEUE1[M]; int front = -1,rear = -1; int mark = 0; int QUEUE2[M]; BSLinkList p = Blist->link ; int i = 0; int height = 0; string s[M]; do{ if(p->flag == 1) { if(mark == 1) {p = p->link;mark = 0;} else{ if(p->info.pointer == NULL) s[i+1]+=' '; else{ s+="↓"; QUEUE1[++rear] = p; QUEUE2[rear] = i; i++; if(height<i) height = i; p = p->info.pointer; } } } else { s+=p->info.data; s+="→"; p = p->link; } if(p ==NULL) { s+="^"; if(front<rear) { p = QUEUE1[++front]; i = QUEUE2[front]; mark = 1; } } }while(front<rear||p!=NULL); for(i =0;i<=height;i++) cout<<s.data()<<endl; } int main() { string s = "(a,(b,c))"; BSLinkList Blist = (BSLinkList)malloc(sizeof(BSNode)); Blist->flag = 0; Blist->info.data = 0; Blist->link = NULL; cout<<CREAT(Blist,s); Display(Blist); } |
|
|