关于“ multiple definition of `generate(int, DLList)'”,该如何解决

关于“ multiple definition of `generate(int, DLList)'”
写了三个文件:一个.h,两个cpp
dllist.h:
class DLLElement {
public:
DLLElement( void *itemPtr, int sortKey ); // initialize a list element

 DLLElement *next; // next element on list 
// NULL if this is the last 
DLLElement *prev; // previous element on list 
// NULL if this is the first


 int key; // priority, for a sorted list 
void *item; // pointer to item on the list 
}; 

class DLList {

public:
DLList(); // initialize the list 
~DLList(); // de-allocate the list

 void Prepend(void *item); // add to head of list (set key = min_key-1) 
void Append(void *item); // add to tail of list (set key = max_key+1) 
void *Remove(int *keyPtr); // remove from head of list 

// set *keyPtr to key of the removed item 
// return item (or NULL if list is empty)

 bool IsEmpty(); // return true if list has elements


 // routines to put/get items on/off list in order (sorted by key) 
void SortedInsert(void *item, int sortKey); 
void *SortedRemove(int sortKey); // remove first item with key==sortKey 


// return NULL if no such item exists 

private:
DLLElement *first; // head of the list, NULL if empty 
DLLElement *last; // last element of the list, NULL if empty 

};

dllist.cc:
extern "C" {
#include <assert.h>

#define ASSERT(expression)  assert(expression)
}

#include <iostream>
#include "dllist.h"
using namespace std;

DLLElement::DLLElement(void *itemPtr, int sortKey )
{
item=itemPtr;
key=sortKey;
next=prev=NULL;
}


DLList::DLList()
{
first=NULL;
last=NULL;
}

DLList::~DLList()
{
DLLElement *p,*q;
q=p=first;
while(p!=NULL)
{
q=p->next;
delete[]p;
p=q;
}
}

void DLList::Prepend(void *item)
{
DLLElement *q;
q=first;
q->prev=(DLLElement *)item;
((DLLElement *)item)->next=q;
((DLLElement *)item)->prev=NULL;
((DLLElement *)item)->key=q->key-1;
first=(DLLElement *)item;
}

void DLList::Append(void *item)
{
DLLElement *q;
q=last;
q->next=(DLLElement *)item;
((DLLElement *)item)->prev=q;
((DLLElement *)item)->next=NULL;
((DLLElement *)item)->key=last->key+1;
last=(DLLElement *)item;
}


bool DLList::IsEmpty()
 {
 if(last==first)
 return 0;
 else
 return 1;
 }

void * DLList::Remove(int *keyPtr)
{
DLLElement *q,*p;
p=first;
if(!p)
return NULL;
else
{
keyPtr=&p->key;
q=first->next;
p->next=NULL;
q->prev=NULL;
first=q;
return p;
}
}

void DLList::SortedInsert(void *item, int sortKey)
{
DLLElement *p,*q;
p=first;
q->item=item;
q->key=sortKey;
while(p!=NULL)
{
if(sortKey>=p->key)
p++;
else
{
if((p!=first)&&(p!=last))
{
p->prev->next=q;
q->prev=p->prev;
q->next=p;
p->prev=q;
}
else if(p==first)
{
p->prev=q;
q->next=p;
q->prev=NULL;
first=q;
}
else
{
p->next=q;
q->prev=p;
q->next=NULL;
last=q;
}
}
}
}
 
void * DLList::SortedRemove(int sortKey)
{
DLLElement *p;
p=first;
while(p!=NULL)
{
if(p->key==sortKey)
{
if((p!=first)&&(p!=last))
{
p->prev->next=p->next;
p->next->prev=p->prev;
}
else if(p==first)
{
p->next=first;
p->next->prev=NULL;
}
else
{
p->prev=last;
p->prev->next=NULL;
}
return p;
}
else
p++;
}
if(p==NULL)
return NULL;
}
 
dllist-driver.cc:
#include "dllist.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

void generate(int n,DLList m)
{
int i,keyword,*it;
//DLLElement *q;