classify.c
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:9k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct SUBLINK
  5. {
  6. int index;
  7. struct SUBLINK *next;
  8. }sublink;
  9. struct NODE
  10. {
  11. char feature[20];
  12. int upnnum;
  13. struct SUBLINK *upnode;
  14. int fullfill;
  15. int type;
  16. int state;
  17. int sonnum;
  18. struct SUBLINK *sonnode;
  19. }node;
  20. #define MAXNUM 1000
  21. struct NODE *nodelink[MAXNUM];
  22. int nodenum;
  23. void initiate();
  24. void quarry();
  25. void modify();
  26. int extend(struct NODE *ntx);
  27. int showfault() ;
  28. void store();
  29. void main()
  30. {
  31. int flag;
  32. initiate();
  33. for(;;)
  34. {
  35. printf("nt请选择操作:nnt1、查询;nnt2、添加新知识;nnt3、退出程序.nnt");
  36. scanf("%d",&flag);
  37. switch(flag)
  38. {
  39. case 1:
  40. quarry();
  41. break;
  42. case 2:
  43. modify();
  44. break;
  45. case 3:
  46. store();
  47. default:
  48. printf("n输入错误,请重新输入n");
  49. }
  50. }
  51. }
  52. void initiate()//初始化
  53. {
  54. int i , j;
  55. char s[10];
  56. FILE *kf;
  57. struct NODE *newnode;
  58. struct SUBLINK *newlink , *oldlink;
  59. if((kf = fopen("knowledgestore.txt" , "r")) == NULL)
  60. {
  61. printf("Cannot create/open file");
  62. exit(1);
  63. }
  64. fscanf(kf , "%5d" , &nodenum);
  65. for(i=0 ; i < nodenum ; i++)
  66. {
  67. newnode = (struct NODE*)malloc (sizeof(node));
  68. if(newnode == NULL)
  69. {
  70. printf("n内存不够!n");
  71. exit(0);
  72. }
  73. fscanf(kf , "%20s" , newnode->feature);
  74. fscanf(kf , "%5d" , &newnode->upnnum);
  75. for(j=0 ; j<newnode->upnnum ; j++)
  76. {
  77. newlink = (struct SUBLINK*) malloc (sizeof(sublink));
  78. if(newlink == NULL)
  79. {
  80. printf("n内存不够!n");
  81. exit(0);
  82. }
  83. fscanf(kf , "%5d" , &newlink->index);
  84. if(j == 0)
  85. newnode->upnode = oldlink = newlink;
  86. newlink->next = NULL;
  87. oldlink->next = newlink;
  88. oldlink = newlink;
  89. }
  90. newnode->fullfill = 0;
  91. newnode->state = 0;
  92. fscanf(kf , "%5d" , &newnode->type);
  93. fscanf(kf , "%5d" , &newnode->sonnum);
  94. for(j=0 ; j < newnode->sonnum ; j++)
  95. {
  96. newlink = (struct SUBLINK*)malloc(sizeof(sublink));
  97. if(newlink == NULL)
  98. {
  99. printf("n内存不够!n");
  100. exit(0);
  101. }
  102. fscanf(kf , "%5d" , &newlink->index);
  103. if(j == 0)
  104. newnode->sonnode = oldlink = newlink;
  105. newlink->next = NULL;
  106. oldlink->next = newlink;
  107. oldlink = newlink;
  108. }
  109. nodelink[i] = newnode;
  110. }
  111. fscanf(kf , "%10s" , s);
  112. if(strcmp(s , "end") != 0)
  113. {
  114. printf("n程序初始化失败!");
  115. exit(0);
  116. }
  117. }
  118. void quarry()
  119. {
  120. struct NODE *ntx;
  121. char feature[100];
  122. int i , flag;
  123. for(;;)
  124. {
  125. flag = 0;
  126. printf("n请输入动物的特征:");
  127. scanf("%s" , feature);
  128. for(i = 0 ; i < nodenum ; i++)
  129. {
  130. ntx = nodelink[i];
  131. if(strstr(feature,ntx->feature) != NULL)
  132. {
  133. ntx->state = 1;
  134. flag = extend(ntx);
  135. }
  136. }
  137. if(flag >= 1)
  138. {
  139. for(i = 0 ; i < nodenum ; i++)
  140. {
  141. nodelink[i]->fullfill = 0;
  142. nodelink[i]->state = 0;
  143. }
  144. break;
  145. }
  146. if(flag == 0)
  147. if(showfault() == 0)break;
  148. }
  149. }
  150. int extend(struct NODE *ntx)
  151. {
  152. int i , index;
  153. int flag;
  154. struct NODE *nextone;
  155. struct SUBLINK *son;
  156. if(ntx->sonnum == 0)
  157. {
  158. printf("n结果为%20sn" , ntx->feature);
  159. return 1;
  160. }
  161. son = ntx->sonnode;
  162. flag = 0;
  163. for(i = 0 ; i < (ntx->sonnum) ; i++)
  164. {
  165. index = son->index;
  166. nextone = nodelink[index];
  167. if(nextone->type == 0)//或节点
  168. {
  169. if(nextone->state != 1)
  170. {
  171. nextone->state = 1;
  172. printf("n表明具有%20s特征" , nextone->feature);
  173. flag += extend(nextone);
  174. }
  175. }
  176. else
  177. {
  178. nextone->fullfill++;
  179. if(nextone->fullfill == nextone->upnnum)
  180. {
  181. nextone->state = 1;
  182. printf("n表明具有%20s特征" , nextone->feature);
  183. flag =+ extend(nextone);
  184. }
  185. }
  186. son = son->next;
  187. }
  188. return flag;
  189. }
  190. void modify()
  191. {
  192. int i ;
  193. char choice , feature[100];
  194. struct NODE *ntx , *newnode;
  195. struct SUBLINK *endl , *newl;
  196. newnode = (struct NODE*)malloc(sizeof(node));
  197. if(newnode == NULL)
  198. {
  199. printf("n内存不够!n");
  200. exit(0);
  201. }
  202. newnode->sonnum = 0;
  203. newnode->upnnum = 0;
  204. newnode->fullfill = 0;
  205. printf("n请输入新特征n");
  206. scanf("%s",newnode->feature);
  207. printf("新特征类型:n与节点(1),或节点(0)");
  208. scanf("%d" , &newnode->type);
  209. newnode->state = 0;
  210. newnode->fullfill = 0;
  211. for(;;)
  212. {
  213. printf("n是否为叶节点?(Y/N)n");
  214.     scanf("%s" , &choice);
  215. choice = toupper(choice);
  216. if(choice == 'N')
  217. {
  218. printf("n请输入新特征描述的对象n");
  219. scanf("%s" , feature);
  220. for(i = 0 ; i < nodenum ; i++)
  221. {
  222. ntx = nodelink[i];
  223. if(strstr(feature,ntx->feature) != NULL)
  224. {
  225. newl = (struct SUBLINK*) malloc (sizeof(sublink));
  226. if(newl == NULL)
  227. {
  228. printf("n内存不够!n");
  229. exit(0);
  230. }
  231. if(newnode->sonnum == 0)
  232. newnode->sonnode = endl = newl;
  233. newl->index = i;
  234. endl->next = newl;
  235. endl = newl;
  236. newl->next = NULL;
  237. newnode->sonnum++;
  238. /////////////////////////////////将信息写入子节点
  239. newl = (struct SUBLINK*) malloc (sizeof(sublink));
  240. if(newl == NULL)
  241. {
  242. printf("n内存不够!n");
  243. exit(0);
  244. }
  245. if(ntx->upnnum == 0)
  246. ntx->upnode = endl = newl;
  247. newl->index = nodenum;
  248. newl->next = ntx->upnode;
  249. ntx->upnode = newl;
  250. ntx->upnnum++;
  251. }
  252. }
  253. break;
  254. }
  255. if(choice == 'Y')break;
  256. }
  257. for(;;)
  258. {
  259. printf("n是否为顶点?(Y/N)n");
  260. scanf("%s" , &choice);
  261. choice = toupper(choice);
  262. if(choice == 'N')
  263. {
  264. printf("n请输入对新对象的描述n");
  265. scanf("%s" , feature);
  266. for(i = 0 ; i < nodenum ; i++)
  267. {
  268. ntx = nodelink[i];
  269. if(strstr(feature , ntx->feature)!=NULL)
  270. {
  271. newl = (struct SUBLINK*) malloc (sizeof(sublink));
  272. if(newl == NULL)
  273. {
  274. printf("n内存不够!n");
  275. exit(0);
  276. }
  277. if(newnode->upnnum == 0)
  278. newnode->upnode = endl = newl;
  279. newl->index = i;
  280. endl->next = newl;
  281. endl = newl;
  282. newl->next = NULL;
  283. newnode->upnnum++;
  284. ///////////////////////////////将信息写入父节点
  285. newl = (struct SUBLINK*) malloc (sizeof(sublink));
  286. if(newl == NULL)
  287. {
  288. printf("n内存不够!n");
  289. exit(0);
  290. }
  291. if(ntx->sonnum == 0)
  292. ntx->sonnode = endl = newl;
  293. newl->index = nodenum;
  294. newl->next = ntx->sonnode;
  295. ntx->sonnode = newl;
  296. ntx->sonnum++;
  297. }
  298. }
  299. break;
  300. }
  301. if(choice == 'Y')break;
  302. }
  303. nodelink[nodenum] = newnode;
  304. nodenum++;
  305. }
  306. void store()
  307. {
  308. int i , j;
  309. char s[10];
  310. FILE *kf;
  311. struct NODE *writenode;
  312. struct SUBLINK *newlink , *oldlink;
  313. if((kf = fopen("knowledgestore.txt" , "w")) == NULL)
  314. {
  315. printf("Cannot create/open file");
  316. exit(1);
  317. }
  318. fprintf(kf , "%5d" , nodenum);
  319. for(i = 0 ; i < nodenum ; i++)
  320. {
  321. writenode = nodelink[i];
  322. fprintf(kf , "%20s" , writenode->feature);
  323. fprintf(kf , "%5d" , writenode->upnnum);
  324. newlink = writenode->upnode;
  325. for(j = 0 ; j < writenode->upnnum ; j++)
  326. {
  327. fprintf(kf , "%5d" , newlink->index);
  328. oldlink = newlink;
  329. newlink = newlink->next;
  330. free(oldlink);
  331. }
  332. fprintf(kf , "%5d" , writenode->type);
  333. fprintf(kf , "%5d" , writenode->sonnum);
  334. newlink = writenode->sonnode;
  335. for(j = 0 ; j < writenode->sonnum ; j++)
  336. {
  337. fprintf(kf , "%5d" , newlink->index);
  338. oldlink = newlink;
  339. newlink = newlink->next;
  340. free(oldlink);
  341. }
  342. free(writenode);
  343. }
  344. strcpy(s , "end");
  345. fprintf(kf , "%10s" , s);
  346. fclose(kf);
  347. exit(0);
  348. }
  349. int showfault()
  350. {
  351. char choice;
  352. for(;;)
  353. {
  354. printf("是否继续?(Y/N)n");
  355. scanf("%s" , &choice);
  356. while(choice == '10');
  357. choice = toupper(choice);
  358. if(choice == 'Y')return 1;
  359. if(choice == 'N')exit(0);
  360. }
  361. }