classify.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:9k
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- struct SUBLINK
- {
- int index;
-
- struct SUBLINK *next;
- }sublink;
- struct NODE
- {
- char feature[20];
-
- int upnnum;
-
- struct SUBLINK *upnode;
-
- int fullfill;
-
- int type;
-
- int state;
-
- int sonnum;
-
- struct SUBLINK *sonnode;
- }node;
- #define MAXNUM 1000
- struct NODE *nodelink[MAXNUM];
- int nodenum;
- void initiate();
- void quarry();
- void modify();
- int extend(struct NODE *ntx);
- int showfault() ;
- void store();
- void main()
- {
- int flag;
-
- initiate();
-
- for(;;)
-
- {
-
- printf("nt请选择操作:nnt1、查询;nnt2、添加新知识;nnt3、退出程序.nnt");
-
- scanf("%d",&flag);
-
- switch(flag)
-
- {
-
- case 1:
-
- quarry();
-
- break;
-
- case 2:
-
- modify();
-
- break;
-
- case 3:
-
- store();
-
- default:
-
- printf("n输入错误,请重新输入n");
-
- }
-
- }
- }
- void initiate()//初始化
- {
- int i , j;
-
- char s[10];
-
- FILE *kf;
-
- struct NODE *newnode;
-
- struct SUBLINK *newlink , *oldlink;
-
- if((kf = fopen("knowledgestore.txt" , "r")) == NULL)
-
- {
-
- printf("Cannot create/open file");
-
- exit(1);
-
- }
-
- fscanf(kf , "%5d" , &nodenum);
-
- for(i=0 ; i < nodenum ; i++)
-
- {
-
- newnode = (struct NODE*)malloc (sizeof(node));
-
- if(newnode == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
-
- fscanf(kf , "%20s" , newnode->feature);
-
- fscanf(kf , "%5d" , &newnode->upnnum);
-
- for(j=0 ; j<newnode->upnnum ; j++)
-
- {
-
- newlink = (struct SUBLINK*) malloc (sizeof(sublink));
-
- if(newlink == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
-
- fscanf(kf , "%5d" , &newlink->index);
-
- if(j == 0)
-
- newnode->upnode = oldlink = newlink;
-
- newlink->next = NULL;
-
- oldlink->next = newlink;
-
- oldlink = newlink;
-
- }
-
- newnode->fullfill = 0;
-
- newnode->state = 0;
-
- fscanf(kf , "%5d" , &newnode->type);
-
- fscanf(kf , "%5d" , &newnode->sonnum);
-
- for(j=0 ; j < newnode->sonnum ; j++)
-
- {
-
- newlink = (struct SUBLINK*)malloc(sizeof(sublink));
-
- if(newlink == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
-
- fscanf(kf , "%5d" , &newlink->index);
-
- if(j == 0)
-
- newnode->sonnode = oldlink = newlink;
-
- newlink->next = NULL;
-
- oldlink->next = newlink;
-
- oldlink = newlink;
-
- }
-
- nodelink[i] = newnode;
-
- }
-
- fscanf(kf , "%10s" , s);
-
- if(strcmp(s , "end") != 0)
-
- {
-
- printf("n程序初始化失败!");
-
- exit(0);
-
- }
- }
- void quarry()
- {
- struct NODE *ntx;
-
- char feature[100];
-
- int i , flag;
-
- for(;;)
-
- {
-
- flag = 0;
-
- printf("n请输入动物的特征:");
-
- scanf("%s" , feature);
-
- for(i = 0 ; i < nodenum ; i++)
-
- {
-
- ntx = nodelink[i];
-
- if(strstr(feature,ntx->feature) != NULL)
-
- {
-
- ntx->state = 1;
-
- flag = extend(ntx);
-
- }
-
- }
-
- if(flag >= 1)
-
- {
-
- for(i = 0 ; i < nodenum ; i++)
-
- {
-
- nodelink[i]->fullfill = 0;
-
- nodelink[i]->state = 0;
-
- }
-
- break;
-
- }
-
- if(flag == 0)
-
- if(showfault() == 0)break;
-
- }
- }
- int extend(struct NODE *ntx)
- {
- int i , index;
-
- int flag;
-
- struct NODE *nextone;
-
- struct SUBLINK *son;
-
- if(ntx->sonnum == 0)
-
- {
-
- printf("n结果为%20sn" , ntx->feature);
-
- return 1;
-
- }
-
- son = ntx->sonnode;
-
- flag = 0;
-
- for(i = 0 ; i < (ntx->sonnum) ; i++)
-
- {
-
- index = son->index;
-
- nextone = nodelink[index];
-
- if(nextone->type == 0)//或节点
-
- {
-
- if(nextone->state != 1)
-
- {
-
- nextone->state = 1;
-
- printf("n表明具有%20s特征" , nextone->feature);
-
- flag += extend(nextone);
-
- }
-
- }
-
- else
-
- {
-
- nextone->fullfill++;
-
- if(nextone->fullfill == nextone->upnnum)
-
- {
-
- nextone->state = 1;
-
- printf("n表明具有%20s特征" , nextone->feature);
-
- flag =+ extend(nextone);
-
- }
-
- }
- son = son->next;
-
- }
-
- return flag;
- }
- void modify()
- {
- int i ;
-
- char choice , feature[100];
-
- struct NODE *ntx , *newnode;
-
- struct SUBLINK *endl , *newl;
-
- newnode = (struct NODE*)malloc(sizeof(node));
-
- if(newnode == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
-
- newnode->sonnum = 0;
-
- newnode->upnnum = 0;
-
- newnode->fullfill = 0;
-
- printf("n请输入新特征n");
-
- scanf("%s",newnode->feature);
-
- printf("新特征类型:n与节点(1),或节点(0)");
-
- scanf("%d" , &newnode->type);
-
- newnode->state = 0;
-
- newnode->fullfill = 0;
-
- for(;;)
-
- {
-
- printf("n是否为叶节点?(Y/N)n");
-
- scanf("%s" , &choice);
-
- choice = toupper(choice);
-
- if(choice == 'N')
-
- {
-
- printf("n请输入新特征描述的对象n");
-
- scanf("%s" , feature);
-
- for(i = 0 ; i < nodenum ; i++)
-
- {
-
- ntx = nodelink[i];
-
- if(strstr(feature,ntx->feature) != NULL)
-
- {
-
- newl = (struct SUBLINK*) malloc (sizeof(sublink));
-
- if(newl == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
- if(newnode->sonnum == 0)
-
- newnode->sonnode = endl = newl;
-
- newl->index = i;
-
- endl->next = newl;
-
- endl = newl;
-
- newl->next = NULL;
-
- newnode->sonnum++;
-
- /////////////////////////////////将信息写入子节点
-
- newl = (struct SUBLINK*) malloc (sizeof(sublink));
- if(newl == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
- if(ntx->upnnum == 0)
-
- ntx->upnode = endl = newl;
-
- newl->index = nodenum;
-
- newl->next = ntx->upnode;
-
- ntx->upnode = newl;
-
- ntx->upnnum++;
-
- }
- }
-
- break;
-
- }
-
- if(choice == 'Y')break;
-
- }
-
- for(;;)
-
- {
-
- printf("n是否为顶点?(Y/N)n");
-
- scanf("%s" , &choice);
-
- choice = toupper(choice);
-
- if(choice == 'N')
-
- {
-
- printf("n请输入对新对象的描述n");
-
- scanf("%s" , feature);
-
- for(i = 0 ; i < nodenum ; i++)
-
- {
-
- ntx = nodelink[i];
-
- if(strstr(feature , ntx->feature)!=NULL)
-
- {
-
- newl = (struct SUBLINK*) malloc (sizeof(sublink));
-
- if(newl == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
-
- if(newnode->upnnum == 0)
-
- newnode->upnode = endl = newl;
-
- newl->index = i;
-
- endl->next = newl;
-
- endl = newl;
-
- newl->next = NULL;
-
- newnode->upnnum++;
-
- ///////////////////////////////将信息写入父节点
-
- newl = (struct SUBLINK*) malloc (sizeof(sublink));
-
- if(newl == NULL)
-
- {
-
- printf("n内存不够!n");
-
- exit(0);
-
- }
-
- if(ntx->sonnum == 0)
-
- ntx->sonnode = endl = newl;
-
- newl->index = nodenum;
-
- newl->next = ntx->sonnode;
-
- ntx->sonnode = newl;
-
- ntx->sonnum++;
-
- }
- }
-
- break;
- }
-
- if(choice == 'Y')break;
-
- }
-
- nodelink[nodenum] = newnode;
-
- nodenum++;
- }
- void store()
- {
- int i , j;
-
- char s[10];
-
- FILE *kf;
-
- struct NODE *writenode;
-
- struct SUBLINK *newlink , *oldlink;
-
- if((kf = fopen("knowledgestore.txt" , "w")) == NULL)
-
- {
-
- printf("Cannot create/open file");
-
- exit(1);
-
- }
- fprintf(kf , "%5d" , nodenum);
-
- for(i = 0 ; i < nodenum ; i++)
-
- {
-
- writenode = nodelink[i];
-
- fprintf(kf , "%20s" , writenode->feature);
-
- fprintf(kf , "%5d" , writenode->upnnum);
-
- newlink = writenode->upnode;
-
- for(j = 0 ; j < writenode->upnnum ; j++)
-
- {
-
- fprintf(kf , "%5d" , newlink->index);
-
- oldlink = newlink;
-
- newlink = newlink->next;
-
- free(oldlink);
-
- }
-
- fprintf(kf , "%5d" , writenode->type);
-
- fprintf(kf , "%5d" , writenode->sonnum);
-
- newlink = writenode->sonnode;
-
- for(j = 0 ; j < writenode->sonnum ; j++)
-
- {
-
- fprintf(kf , "%5d" , newlink->index);
-
- oldlink = newlink;
-
- newlink = newlink->next;
-
- free(oldlink);
-
- }
- free(writenode);
-
- }
- strcpy(s , "end");
-
- fprintf(kf , "%10s" , s);
-
- fclose(kf);
-
- exit(0);
- }
- int showfault()
- {
- char choice;
-
- for(;;)
-
- {
-
- printf("是否继续?(Y/N)n");
-
- scanf("%s" , &choice);
-
- while(choice == '10');
-
- choice = toupper(choice);
-
- if(choice == 'Y')return 1;
-
- if(choice == 'N')exit(0);
-
- }
- }