datastru
知名人士
知名人士
  • 铜币2枚
  • 威望0点
  • 贡献值0点
阅读:853回复:0

[求助]帮忙弄弄显示部分

楼主#
更多 发布于:2004-09-29 11:14
原题是这样的:假设广义表由原子元素,逗号,空格与圆括号组成,请写出可产生此广义表的链表表示的算法。
例如输入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);
}


我实话告诉你们,我可是身经百战了.bbs我见的多了,哪个版我没灌过?你们要知道, 一塌糊涂的triangle,PIC,SEX版,那比你们不知道厉害到哪里去了,我在那谈笑风声.你 们有一个好,就是无论在哪个版,什么话题都灌,但是灌来灌去的问题,都too simple, sometimes naive!你们懂不懂呀?啊?所以说灌水啊,关键是要提高自己的知识水平.你 们啊,不要总想着弄个大坑,然后灌上十大,再把我羞辱一番……你们啊,naive!你们这 样灌是不行地!~那你問我支持不支持灌水,我說支持,我常來這裡灌,你說支持不支持?
游客

返回顶部