c语言apriori算法软件,关联规则Apriori算法源代码示例(C语言实现)

Apriori算法是数据挖掘中的算法之一,关联规则Apriori算法的示例程序的全部源代如下(C语言实现),仅供参考。

#include

#include

#include

#include

#define

ITEM_NAME_LENGTH 20

#define

MIN_SUPPORT

2

//数据结构定义

struct

ITEMSET

{

char

itemName[ITEM_NAME_LENGTH];

struct

ITEMSET *next;

};

struct

TRANSACTION

{

unsigned

int tranID;

struct

ITEMSET *itemPoint;

struct

TRANSACTION *next;

};

struct

BIGITEMSET

{

struct

ITEMSET *itemPoint;

unsigned

int count;

struct

BIGITEMSET *next;

};

//数据库

char

*tran1[3]={"1","3","4"};

char

*tran2[3]={"2","3","5"};

char

*tran3[4]={"1","2","3","5"};

char

*tran4[2]={"2","5"};

struct

TRANSACTION *tranHead;

struct

BIGITEMSET

*bigHead;

struct

BIGITEMSET

*test;

struct

BIGITEMSET

*subSetHeadC1,*subSetHeadC2;

//函数声明

void

AprioriGen(void);

void

DispalyTransaction(void);

void

CreateTransactionLink(void);

void

GetBigItem1Set(struct TRANSACTION *head);

void

CompositorBigItem1Set(struct BIGITEMSET *head);

int

HaveThisItem(struct BIGITEMSET *head,char itemName[]);

struct

ITEMSET *CreateItemsetLink(char *tran[],int number);

void

AddNodeToHeadLink(struct BIGITEMSET *head,struct BIGITEMSET

*add);

struct

BIGITEMSET *GetSetsSubSet(unsigned int k_1,struct

BIGITEMSET

*setLink);

void

DeleteNodeLowerMinSupport(struct BIGITEMSET *head,unsigned int

minSupport);

void

RecordSupportCounter(struct BIGITEMSET *iHead,struct

TRANSACTION *tHead,int cN);

//主程序

void

main()

{

CreateTransactionLink();

DispalyTransaction();

AprioriGen();

free(tranHead);

free(bigHead);

printf("\n铵任意键退出");

getch();

return;

}

//函数功能:建立一个事务集合

struct

ITEMSET *CreateItemsetLink(char *tran[],int number)

{

struct

ITEMSET *head,*p,*r;

int

i;

p=(struct

ITEMSET *)malloc(sizeof(struct ITEMSET));

head=p;

p->next=NULL;

r=p;

for(i=0;i

{

p=(struct

ITEMSET *)malloc(sizeof(struct ITEMSET));

strcpy(p->itemName,tran[i]);

p->next=NULL;

r->next=p;

r=r->next;

}

return

head;

}

//函数功能:建立数据库

void

CreateTransactionLink(void)

{

struct

TRANSACTION *p,*q;

p=(struct

TRANSACTION *)malloc(sizeof(struct TRANSACTION));

if(p==NULL)

{

printf("\nNot enough memory\n");

return;

}

tranHead=p;

p->next=NULL;

q=p;

p=(struct

TRANSACTION *)malloc(sizeof(struct TRANSACTION));

if(p==NULL)

{

printf("\nNot enough memory\n");

return;

}

p->itemPoint=CreateItemsetLink(tran1,3);

p->tranID=1;

p->next=NULL;

q->next=p;

q=q->next;

p=(struct

TRANSACTION *)malloc(sizeof(struct TRANSACTION));

if(p==NULL)

{

printf("\nNot enough memory\n");

return;

}

p->itemPoint=CreateItemsetLink(tran2,3);

p->tranID=2;

p->next=NULL;

q->next=p;

q=q->next;

p=(struct

TRANSACTION *)malloc(sizeof(struct TRANSACTION));

if(p==NULL)

{

printf("\nNot enough memory\n");

return;

}

p->itemPoint=CreateItemsetLink(tran3,4);

p->tranID=3;

p->next=NULL;

q->next=p;

q=q->next;

p=(struct

TRANSACTION *)malloc(sizeof(struct TRANSACTION));

if(p==NULL)

{

printf("\nNot enough memory\n");

return;

}

p->itemPoint=CreateItemsetLink(tran4,2);

p->tranID=4;

p->next=NULL;

q->next=p;

}

//函数功能:显示数据集合的所有信息

void

DispalyTransaction(void)

{

struct

TRANSACTION *p;

struct

ITEMSET *r;

p=tranHead->next;

r=tranHead->next->itemPoint->next;

printf("数据库如下:\n");

while(p)

{

printf("事务

ID号:

- 该事务的项目:

",p->tranID);

while(r)

{

printf("%3s",r->itemName);

r=r->next;

}

printf("\n");

p=p->next;

if(p)

r=p->itemPoint->next;

}

}

//函数功能:从数据库获取大项目集1项目集

void

GetBigItem1Set(struct TRANSACTION *head)

{

struct

TRANSACTION *tempTran;

struct

ITEMSET

*tempItem;

struct

BIGITEMSET *p,*q;

p=(struct

BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));

if(p==NULL)

{

printf("\nNot enough memory\n");

return;

}

bigHead=p;

q=p;

p->next=NULL;

p->itemPoint=NULL;

tempTran=head->next;

tempItem=head->next->itemPoint->next;

while(tempTran)//遍历整个数据集

{

while(tempItem)//遍历整个事务集

{

p=(struct

BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));

if(p==NULL)

{

printf("\nNot enough memory\n");

return;

}

if(!HaveThisItem(bigHead,tempItem->itemName))//如果还没在此项目,加到大项目中

{

p->itemPoint=(struct ITEMSET

*)malloc(sizeof(struct ITEMSET));

if(p->itemPoint==NULL)

{

printf("\nNot enough memory\n");

return;

}

strcpy(p->itemPoint->itemName,tempItem->itemName);

p->next=NULL;

p->itemPoint->next=NULL;

AddNodeToHeadLink(bigHead,p);

}

tempItem=tempItem->next;

}

tempItem=tempTran->itemPoint->next;

tempTran=tempTran->next;

}

CompositorBigItem1Set(bigHead);

}

//函数功能:判断项目是否在已有项目集中

int

HaveThisItem(struct BIGITEMSET *head,char itemName[])

{

struct

BIGITEMSET *p;

struct

ITEMSET

*q;

p=head->next;

while(p)

{

q=p->itemPoint;

while(q)

{

if(strcmp(q->itemName,itemName)==0)

return

1;

q=q->next;

}

p=p->next;

}

return

0;

}

//函数功能:在已有项目集中加入一个新的项目

void

AddNodeToHeadLink(struct BIGITEMSET *head,struct BIGITEMSET

*add)

{

struct

BIGITEMSET *p,*q;

p=head;

q=head->next;

while(q)

{

p=q;

q=q->next;

}

p->next=add;

}

//函数功能:对项目集进行排序,小到大

void

CompositorBigItem1Set(struct BIGITEMSET *head)

{

char

itemName[ITEM_NAME_LENGTH];

struct

BIGITEMSET *p,*q;

p=head->next;

q=head->next->next;

while(q)

{

while(q)

{

if(strcmp(q->itemPoint->itemName,p->itemPoint->itemName)<0)

{

strcpy(itemName,q->itemPoint->itemName);

strcpy(q->itemPoint->itemName,p->itemPoint->itemName);

strcpy(p->itemPoint->itemName,itemName);

}

q=q->next;

}

p=p->next;

q=p->next;

}

}

//函数功能:删除支持数小于最小支持数的结点

void

DeleteNodeLowerMinSupport(struct BIGITEMSET *head,unsigned int

minSupport)

{

struct

BIGITEMSET

*p,*q;

p=head;

q=head->next;

while(q)

{

if(q->count

{

p->next=q->next;

free(q);

q=p->next;

continue;

}

p=p->next;

q=q->next;

}

if(q=NULL)

p->next=NULL;

}

//函数功能:对项目支持数进行计数

void

RecordSupportCounter(struct BIGITEMSET *bHead,struct

TRANSACTION *tHead,int cN)

{

struct

TRANSACTION *p;

struct

BIGITEMSET

*r,*s;

struct

ITEMSET *m;

unsigned

int i;

int

count0=0,count1=0,count2=0,count3=0;

r=bHead->next;

while(r)//先对每个记录清零

{

r->count=0;

r=r->next;

}

r=bHead->next;

switch(cN)

{

case

1:

while(r)//对大项集中每一项都有要对数据集进行完全遍历

{

p=tHead->next;

while(p)//对数据集进行完全遍历

{

m=p->itemPoint->next;

while(m)//对事件完全遍历

{

if(strcmp(m->itemName,r->itemPoint->itemName)==0)

r->count++;

m=m->next;

}

p=p->next;

}

r=r->next;

}

break;

case

2:

while(r)//对大项集中每一项都有要对数据集进行完全遍历

{

p=tHead->next;

while(p)//对数据集进行完全遍历

{

m=p->itemPoint->next;

while(m)//对事件完全遍历

{

for(i=0;iitemPoint->itemName);i++)

{

if(r->itemPoint->itemName[0]==m->itemName[i])

count0++;

if(r->itemPoint->itemName[1]==m->itemName[i])

count1++;

}

m=m->next;

}

if((count0==count1)&&(count0!=0))

count2++;

count0=0;

count1=0;

p=p->next;

}

if(count2)

r->count=count2;

else

r->count=0;

count0=0;

count1=0;

count2=0;

r=r->next;

}

break;

case

3:

while(r)//对大项集中每一项都有要对数据集进行完全遍历

{

p=tHead->next;

while(p)//对数据集进行完全遍历

{

m=p->itemPoint->next;

while(m)//对事件完全遍历

{

for(i=0;iitemPoint->itemName);i++)

{

if(r->itemPoint->itemName[0]==m->itemName[i])

count0++;

if(r->itemPoint->itemName[1]==m->itemName[i])

count1++;

if(r->itemPoint->itemName[2]==m->itemName[i])

count2++;

}

m=m->next;

}

if((count0==count1)&&(count1==count2)&&(count0!=0))

count3++;

count0=0;

count1=0;

count2=0;

p=p->next;

}

if(count3)

r->count=count3;

else

r->count=0;

count0=0;

count1=0;

count2=0;

count3=0;

r=r->next;

}

r=bHead->next;

s=r->next;

while(s)

{

if(strcmp(r->itemPoint->itemName,s->itemPoint->itemName)==0)

{

r->next=s->next;

free(s);

s=r->next;

continue;

}

r=r->next;

s=s->next;

}

if(s)

r->next=NULL;

break;

default:

break;

}

}

//函数功能:获取K-1子集

struct

BIGITEMSET *GetSetsSubSet(unsigned int k_1,struct

BIGITEMSET

*setLink)

{

struct

BIGITEMSET *head,*p,*q,*r,*s;

struct

ITEMSET *m;

int

i;

p=(struct

BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));

if(p==NULL)

{

printf("\nNot enough memory\n");

return

NULL;

}

head=p;

p->next=NULL;

q=p;

r=setLink->next;

s=r;

switch(k_1)

{

case

1:

while(r)

{

while(s)

{

if(r->itemPoint->itemName[0]itemPoint->itemName[0])

{

p=(struct

BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));

if(p==NULL)

{

printf("\nNot enough memory\n");

return NULL;

}

p->next=NULL;

m=(struct

ITEMSET *)malloc(sizeof(struct ITEMSET));

if(m==NULL)

{

printf("\nNot enough memory\n");

return NULL;

}

m->next=NULL;

m->itemName[0]=r->itemPoint->itemName[0];

m->itemName[1]=s->itemPoint->itemName[0];

for(i=2;i

m->itemName[i]='\0';

p->itemPoint=m;

q->next=p;

q=p;

}

s=s->next;

}

r=r->next;

s=r;

}

return

head;

case

2:

while(r)

{

while(s)

{

if(r->itemPoint->itemName[1]itemPoint->itemName[1])

{

p=(struct

BIGITEMSET *)malloc(sizeof(struct BIGITEMSET));

if(p==NULL)

{

printf("\nNot enough memory\n");

return NULL;

}

p->next=NULL;

m=(struct

ITEMSET *)malloc(sizeof(struct ITEMSET));

if(m==NULL)

{

printf("\nNot enough memory\n");

return NULL;

}

m->next=NULL;

m->itemName[0]=r->itemPoint->itemName[0];

m->itemName[1]=r->itemPoint->itemName[1];

m->itemName[2]=s->itemPoint->itemName[1];

for(i=3;i

m->itemName[i]='\0';

p->itemPoint=m;

q->next=p;

q=p;

}

s=s->next;

}

r=r->next;

s=r;

}

return

head;

default:

return

NULL;

}

}

void

AprioriGen(void)

{

GetBigItem1Set(tranHead);

RecordSupportCounter(bigHead,tranHead,1);

printf("\n项集C1的项目如下:\n");

test=bigHead->next;

while(test)

{

printf("项目:%5s",test->itemPoint->itemName);

printf("

支持度:M\n",test->count);

test=test->next;

}

DeleteNodeLowerMinSupport(bigHead,MIN_SUPPORT);

printf("项集L1的项目如下:\n");

test=bigHead->next;

while(test)

{

printf("项目:%5s",test->itemPoint->itemName);

printf("

支持度:M\n",test->count);

test=test->next;

}printf("\n");

subSetHeadC1=GetSetsSubSet(1,bigHead);

RecordSupportCounter(subSetHeadC1,tranHead,2);

test=subSetHeadC1->next;

printf("项集C2的项目如下:\n");

while(test)

{

printf("项目:%5s",test->itemPoint->itemName);

printf("

支持度:M\n",test->count);

test=test->next;

}

DeleteNodeLowerMinSupport(subSetHeadC1,MIN_SUPPORT);

test=subSetHeadC1->next;

printf("项集L2的项目如下:\n");

while(test)

{

printf("项目:%5s",test->itemPoint->itemName);

printf("

支持度:M\n",test->count);

test=test->next;

}printf("\n");

subSetHeadC2=GetSetsSubSet(2,subSetHeadC1);

RecordSupportCounter(subSetHeadC2,tranHead,3);

test=subSetHeadC2->next;

printf("项集C3的项目如下:\n");

while(test)

{

printf("项目:%5s",test->itemPoint->itemName);

printf("

支持度:M\n",test->count);

test=test->next;

}

DeleteNodeLowerMinSupport(subSetHeadC2,MIN_SUPPORT);

test=subSetHeadC2->next;

printf("项集L3的项目如下:\n");

while(test)

{

printf("项目:%5s",test->itemPoint->itemName);

printf("

支持度:M\n",test->count);

test=test->next;

}printf("\n");

}

运行结果如下:

a4c26d1e5885305701be709a3d33442f.png

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值