本身写链表就不是很强,搞acm就是这样,一点点不知道,模棱两可的话 自己是写不出代码的!一定是要对这个算法熟悉了,才能写出来,对于链表尤其是这样!不然对链表进行next操作和当前节点赋值操作的时候都会出问题!这里建了一棵字典树,26插树????用尾插发写的。这几天一直在看专业书,A题比较少。另外这题真的加深了我对树形结构与指针的使用。感觉很不错,对链表的操作过程,感觉要形象的理解才能做出来,不然就会错的~~~
这个树形结构要注意的就是next与赋值语句的过程,要知道自己的赋值到底是赋值在哪里了。
由于root节点是空的。所以每次都是先next到下一个节点再进行标记修改的工作。从根节点出发先next不就到了第一个字符的位置吗?! 然后对第一个字符的标记进行修改。另外呢赋值新点的话,吧尾指针修改成新的节点就好了,然后对标记进行修改。输出也是能够下去再输出!
代码的可读性应该还不错:
#include<iostream>
#define MAXN 27
#define MAXL 1005
using namespace std;
struct Node
{
int flag;
Node *next[MAXN];
}node[MAXN*MAXL];
int nodeNum=0;
Node *root=&node[nodeNum++];
void insert_tree( char *str )
{
int i,j,len;
Node *tail=root;
Node *pre;
len=strlen( str );
for( i=0;i<len;i++ )
{
j=str[i]-'a';
if( tail->next[j]!=NULL )
{
tail=tail->next[j];
tail->flag++;
}
else
{
pre=&node[nodeNum++];
pre->flag=1;
tail->next[j]=pre;
tail=pre;
}
printf( "%d ",tail->flag );
}
}
int main()
{
//freopen( "out.txt","w",stdout );
int lineNum=-1;
//nodeNum=0;//!!!!!!
char str[MAXL][MAXN];
while( scanf( "%s",str[++lineNum] )!=EOF )
insert_tree( str[lineNum] );
int i,j,at;
for( i=0;i<lineNum;i++ )
{
Node *tail=root;
printf( "%s ",str[i] );
int len=strlen( str[i] );
for( j=0;j<len;j++ )
{
at=str[i][j]-'a';
tail=tail->next[at];
printf( "%c",str[i][j] );
if( tail->flag==1 )
break;
}
printf( "\n" );
}
//system( "pause" );
return 0;
}