数据结构的选取,还做得不太好,会继续改进,请大牛多多指点。
之后我会比较C#与C的Apriori程序,总结一些区别,谈谈面向对象编程在这个算法上的体现与数据结构的选择问题。
1 #include <dos.h>
2 #include <conio.h>
3 #include <math.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 #define ItemNumSize 2
8 #define TranNumSize 100
9 #define LISTINCREMENT 1
10 #define OK 1
11 #define TRUE 1
12 #define FASLE 0
13 #define ERROR 0
14 #define MAX_ARRAY_DIM 100
15 #define MAXSIZE 100
16 typedef char ItemType;
17 typedef int ElemType;
18 float minSupport,minConfidence;
19 //动态内存分配,item用什么数据结构 动态数组,线性表好:数组是整体创建,整体删除的
20 typedef struct
21 {
22 ItemType *item;//项目
23 int length;//当前项目个数
24 int listsize;//当前分配的存储容量
25 }SqList;
26 //事务数组集合
27 typedef struct
28 {
29 SqList r[MAXSIZE+1];
30 int Length;
31 }TranList;
32
33 //初始化项目的线性表
34 int InitListSq(SqList &L)
35 {
36 L.item=(ItemType * )malloc(ItemNumSize *sizeof(ItemType));
37 if (!L.item)exit(OVERFLOW);//存储分配失败
38 L.length=0;//空表长度为0
39 L.listsize=ItemNumSize;//初始化存储容量
40 return OK;
41 }
42 //初始化事务的线性表
43 int InitListTran(TranList &TranL)//还有更好的动态分配方式初始化
44 {
45 for (int i=1;i<=TranNumSize;i++)
46 {
47 InitListSq(TranL.r[i]);
48 }
49 return OK;
50 }
51 //插入项目线性表
52 int listInsertSq(SqList &L,int i,ItemType e)
53 {
54 //在线性表L中第i个位置之前插入新元素e
55 //i的合法值为1<=i<=l.listlength+1
56 ItemType *newbase,*q,*p;
57 if(i<1||i>L.length+1)return ERROR;//i值不合法
58 if (L.length>=L.listsize)//当前存储空间已满,添加分配
59 {
60 //重新分配内存空间
61 newbase=(ItemType *)realloc(L.item,(L.listsize+LISTINCREMENT)*sizeof(ItemType));
62 if (!newbase)exit(OVERFLOW);
63 L.item=newbase;//新基址
64 L.listsize+=LISTINCREMENT;//增加存储容量
65 }
66 q=&(L.item[i-1]);//q为插入位置
67 for(p=&(L.item[L.length-1]);p>=q;--p)
68 *(p+1)=*p;//插入位置,及之后的元素右移
69 *q=e;
70 ++L.length;
71 return OK;
72 }
73 void main()
74 {
75 int c;
76 ItemType e;
77 SqList L;
78 int sn;
79 int ItemNum; //项目个数
80 int trannum[20]={0};