📄 a.txt
字号:
#include<stdio.h>
#include"string.h"
#include<stdlib.h>
#define MaxStrSize 20
typedef struct KeyType /*??????????*/
{
char ch[MaxStrSize];
int length; /*????????*/
}*KeyType;
typedef struct Record /*???????????????????*/
{
KeyType key;
}Record;
typedef enum {LEAF,BRANCH} NodeKind; /*???????{???????}*/
typedef struct TrieNode /*Trie????????*/
{
NodeKind kind;
union
{
struct LEAF /*?????*/
{
KeyType k;
Record *infoptr;
}lf;
struct BRANCH /*??????*/
{
TrieNode *ptr[26];
}bh;
}node;
}TrieNode,*TrieTree;
/*???*/
void TraverseTrie(TrieTree T)
{
int i;
char c1;
KeyType k,k9;
if(T)
{
printf("**********************************************\n");
printf("************ a:traverse a word ***************\n");
printf("* b:traverse words begin with a definite zimu*\n");
printf("**********************************************\n");
printf("please input to choose:");
c1=getchar();
if(c1=='a')
{
printf("please input the word:");
scanf("%s",k9->ch);
k9->length=strlen(k9->ch);
Traverse_one_word(T,k9);
}
if(c1=='b')
Traversewords(T);
}
}
/*????????1*/
void Traversewords(TrieTree T)
{
char c1;
TrieTree p;
p=T;
printf("please input a zimu:");
c1=getchar();
if(T)
{
p=p->node.bh.ptr[change(c1)];
if(!p)
printf("%c",c1);
if(p&&p->kind==BRANCH)
Traversewords(p);
if(p&&p->kind==LEAF)
printf("%s",p->node.lf.k->ch);
}
}
/*????????2 */
int Traverse_one_word(TrieTree T,KeyType kk)
{
int i;
TrieTree p;
p=T;
if(T)
{
for(i=0;i<kk->length;i++)
{
p=p->node.bh.ptr[chang(kk->ch[i])];
if(p&&p->kind==LEAF&&p->node.lf.k->ch==kk->ch)
{
printf("%S",kk->ch);
return 1;
}
if(!p)
{
printf("\nthe word isnot cunzai!\n");
return 0;
}
if(p&&p->kind==LEAF&&(strcmp(p->node.lf.k,kk->ch)!=0))
{
printf("the word isnot cunzai!\n");
return 0;
}
} /*endfor*/
}/*endif(T)*/
}
/*??????? */
int change(char c)
{
if(c>='a'&&c<='z')
return c-'a';
else
printf("error!\n");
}
/*????*/
void InsertTrie(TrieTree T,char *FileName)
{
FILE *fp;
Record *r;
TrieTree p,q,ap;
int i,j;
KeyType k1,k;
k=r->key;
i=0;
if((fp=fopen("FileName","a"))==NULL) /*????????????????????????*/
{
CreatTextFile();
fp=fopen("FileName","a");
}
printf("please input a Record:");
scanf("%s",r->key->ch);
if(!T) /*????*/
{
T=(TrieTree)malloc(sizeof(TrieNode));
T->kind=BRANCH;
for(i=0;i<26;i++) /*????????*/
T->node.bh.ptr[i]=NULL;
p=T->node.bh.ptr[change(k->ch[0])]=(TrieTree)malloc(sizeof(TrieNode));
p->kind=LEAF;
p->node.lf.k=k;
p->node.lf.infoptr=r;
}
else /*?????*/
{
for(p=T,i=0;p&&p->kind==BRANCH&&i<k->length;i++)
{
q=p;
p=p->node.bh.ptr[change(k->ch[i])];
}
i--;
if(p&&(p->kind==LEAF)&&((p->node.lf.k->length)==k->length)
&&(strcmp(p->node.lf.k->ch,k->ch)==0))
/*???????T?д???ù????*/
{
printf("the key cunzai!\n");
}
else /*T?в?????ù??????????*/
if(!p) /*?????*/
{
p=(TrieTree)malloc(sizeof(TrieNode));
q->node.bh.ptr[change(k->ch[i])]=p;
p->kind=LEAF;
p->node.lf.infoptr=NULL;
p->node.lf.k=k;
p->node.lf.infoptr=r;
}
else if(p->kind==LEAF) /*?в????????????*/
{
k1=p->node.lf.k;
do
{
ap=q->node.bh.ptr[change(k->ch[i])]=(TrieTree)malloc(sizeof(TrieNode));
ap->kind=BRANCH;
for(j=0;j<26;j++) /*????????*/
ap->node.bh.ptr[j]=NULL;
q=ap;
i++;
}while(change(k->ch[i])==change(k1->ch[i]));
q->node.bh.ptr[change(k1->ch[i])]=p;
p=q->node.bh.ptr[change(k->ch[i])]=(TrieTree)malloc(sizeof(TrieNode));
p->kind=LEAF;
p->node.lf.k=k;
p->node.lf.infoptr=r;
}
}
fwrite(k->ch,sizeof(k->ch),1,fp);
fclose(fp);
}
/*???????*/
char *CreatTextFile( )
{
char FileName[10];
FILE *fp;
printf("the FileName:");
scanf("%s",FileName);
if((fp=fopen("FileName","r"))==NULL)
{
printf("cannot open file\n");
getchar();
exit(1);
}
fclose(fp);
printf("the file is inited!");
return (FileName);
}
/*?????*/
void Delete(char *FileName,TrieTree T)
{
int i;
FILE *fp;
KeyType k;
TrieTree p,q;
if((fp=fopen("FileName","a"))==NULL)
{
printf("cannot open file\n");
getchar();
exit(1);
}
else
{
if(T)
printf("the Tree isnot cunzai!\n");
else
{
printf("please input one word!\n");
scanf("%s",k->ch);
k->length=strlen(k->ch);
if(Traverse_one_word(T,k))
{
p=T;
for(i=0;i<k->length;i++)
{
q=p;
p=p->node.bh.ptr[change(k->ch[i])];
if(p->kind==LEAF)
{
q->node.bh.ptr[change(k->ch[i])]=NULL;
free(p);
}
} /*endfor*/
}/*endif*/
else
printf("the word isnot cunzai!\n");
}
}
fclose(fp);
}
main()
{
char c2;
TrieTree T;
char *FileName;
FileName=NULL;
T=NULL;
FileName=CreatTextFile();
printf("***********************************\n");
printf("******** 1:Insert ***************\n");
printf("******** 2:Delete ***************\n");
printf("******** 3:Taverse ***************\n");
printf("***********************************\n");
printf("please input a number:");
c2=getchar();
switch(c2)
{
case '1':InsertTrie(T,FileName); break;
case '2':Delete(FileName,T); break;
case '3':TraverseTrie(T); break;
default :printf("please input again\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -