Пример #1
0
/*
 *  traverseDir()
 *	For use with all FATs outside of the initial root directory on
 *	12 and 16 bit FAT file systems.  This is a general purpose routine
 *	that can be used simply to visit all of the nodes in the metadata or
 *	to find the first instance of something, e.g., the first directory
 *	entry where the file is marked deleted.
 *
 *	Unique Input is:
 *	startAt
 *		starting cluster of the directory
 *
 *	This is the cluster that is the first one in this directory.
 *	We read it right away, so we can provide it as data to visitNodes().
 *	Note that we cache this cluster as we read it, because it is
 *	metadata and we cache all metadata.  By doing so, we can
 *	keep pointers to directory entries for quickly moving around and
 *	fixing up any problems we find.  Of course if we get a big
 *	filesystem with a huge amount of metadata we may be hosed, as
 *	we'll likely run out of memory.
 *
 *	I believe in the future this will have to be addressed.  It
 *	may be possible to do more of the processing of problems
 *	within directories as they are cached, so that when memory
 *	runs short we can free cached directories we are already
 *	finished visiting.
 *
 *	The remainder of inputs are described in visitNodes() comments.
 */
void
traverseDir(int fd, int32_t startAt, int depth, int descend, int operation,
    char matchRequired,  struct pcdir **found, int32_t *lastDirCluster,
    struct pcdir **dirEnd, char *recordPath, int *pathLen)
{
	ClusterContents dirdata;
	int32_t dirdatasize = 0;

	if (startAt < FIRST_CLUSTER || startAt > LastCluster)
		return;

	if (readCluster(fd, startAt, &(dirdata.bytes), &dirdatasize,
	    RDCLUST_DO_CACHE) != RDCLUST_GOOD) {
		(void) fprintf(stderr,
		    gettext("Unable to get more directory entries!\n"));
		return;
	}

	if (operation == PCFS_TRAVERSE_ALL) {
		if (Verbose)
			(void) fprintf(stderr,
			    gettext("Directory traversal enters "
			    "allocation unit %d.\n"), startAt);
	}
	visitNodes(fd, startAt, &dirdata, dirdatasize, depth, descend,
	    operation, matchRequired, found, lastDirCluster, dirEnd,
	    recordPath, pathLen);
}
Пример #2
0
SigDenseSet * density(int flag, char *cluster_filename, float par_density,SigDenseSet *sds){
	Graph *g;
	SigDense *sd;
	char line[MAXLINE];
	char clusterName[10];
	char edgesNumber[10];
	char dump[10];
	float dense;
	

	if(flag==0){	//einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio
		sds = initSigDenseSet();
		FILE *fp = fopen(cluster_filename, "r");
		if(fp == NULL){
			 cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl;
			 system("pause");
		}

		while(fgets(line, MAXLINE, fp)){

			if (line[strlen(line)-1] == '\n')
			  line[strlen(line)-1] = STREND;
			sscanf (line,"%s %s %s",clusterName,dump,edgesNumber);  //diavazei tin proti grammi tou kathe cluster
			g=readCluster(fp, edgesNumber);							//(format:#cluster : #edges)

			dense= (float)g->edgecount/(g->nodecount*(g->nodecount-1));
			
		/*	if(dense>=par_density){*/					//elegxos an einai piknos i oxi o cluster.
				SigDense *sd = new SigDense();		// an nai apothikeuse allios katestrepse
				sd->sg       = g;
				insertSigDense(sds, sd);
			/*}
			else{
				destroyGraph(g);
			}*/
		}
		fclose (fp);
	}
	else if(flag==1){			//den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds
		for (sd = sds->first->next; sd != NULL; sd=sd->next){
			if(sd->sg->nodecount>2){			//elegxos gia to plithos ton korifon
				dense= (float)sd->sg->edgecount/(sd->sg->nodecount*(sd->sg->nodecount-1));
			}
			else{
				dense=0;
			}
			if(dense<par_density){					//elegxos an einai piknos i oxi o cluster.
				sd->prev->next=sd->next;			// an oxi, parekampse ton. PROSOXI!!dimiourgia skoupidion(den svino)
				if(sd->next!=NULL)
				sd->next->prev=sd->prev;
			}
		}
	}
	else{
		cout<<"The flag is WRONG in density function"<<endl;
		system("pause");
	}
	return sds;
}
Пример #3
0
/**
 *	Reads the specified cluster into memory. The buffer array should be the size
 *	of a cluster.
 *	TODO: allow buffer size to be smaller than a cluster if there is less than a
 *	      full cluster's worth of data.
 *
 *
 *	@param fatfs
 *	@param uint 			the cluster to read
 *	@param unsigned char 	the buffer to read into
 *	@param uint 			the size of the buffer
 *
 *	@return bool 			true on success, false on failure
 */
bool readClusterSafe( fatfs* fs, uint cluster, unsigned char* buffer, uint size ){
	int startLocation = SEEK_CUR;	
	fseek( fs->fp, fs->clusterSize * cluster, SEEK_SET );
	bool result = readCluster( fs, buffer, size );
	fseek( fs->fp, startLocation, SEEK_SET );
	
	return result;
}
Пример #4
0
/*---------------------------------------------------------------------------
  This function reads the entire file pointed to by handle into buffer.
   int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize)
  Where:
   FileHandle *handle  - Pointer to an open file handle
   uint8_t *buffer     - Pointer to a buffer to store the file
   uint32_t bufferSize - The size of the buffer
  Returns: -1 for error or the file size for success
---------------------------------------------------------------------------*/
int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize)
{
    if(bufferSize >= handle->FileSize) {
        uint32_t clusterId = handle->startingCluster;
        uint32_t read = 0;
        while(clusterId < FAT32_LAST_CLUSTER) {
            read += readCluster(clusterId, buffer+read);
            clusterId = nextFatEntry(clusterId);
        }
        return handle->FileSize;
    }
    return -1;
} // End fatRead()
Пример #5
0
bool Parser::readCluster(
	Graph &G, ClusterGraph &C, ClusterGraphAttributes *CA, cluster rootCluster,
	const XmlTagObject &rootTag)
{
	List<XmlTagObject *> nodeTags;
	rootTag.findSonXmlTagObjectByName("node", nodeTags);

	for(XmlTagObject *obj : nodeTags) {
		const XmlTagObject &nodeTag = *obj;

		XmlAttributeObject *idAttr;
		nodeTag.findXmlAttributeObjectByName("id", idAttr);
		if(!idAttr) {
			OGDF_ERROR("node is missing an attribute "
			          << "(line " << nodeTag.getLine() << ").");
		}

		// Node is a cluster iff it contains other nodes.
		XmlTagObject *nodesTag;
		nodeTag.findSonXmlTagObjectByName("nodes", nodesTag);
		if(nodesTag) {
			// Node tag found, therefore it is a cluster.
			const cluster c = C.newCluster(rootCluster);
			m_clusterId[idAttr->getValue()] = c;

			if(!readCluster(G, C, CA, c, *nodesTag)) {
				return false;
			}
		} else {
			// Node tag not found, therefore it is "normal" node.
			const node v = G.newNode();
			C.reassignNode(v, rootCluster);
			m_nodeId[idAttr->getValue()] = v;

			if(CA) {
				readAttributes(*CA, v, nodeTag);
			}
		}
	}

	return true;
}
Пример #6
0
/*---------------------------------------------------------------------------
  This function reads the entire file pointed to by handle into buffer.
   int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize)
  Where:
   FileHandle *handle  - Pointer to an open file handle
   uint8_t *buffer     - Pointer to a buffer to store the file
   uint32_t bufferSize - The size of the buffer
  Returns: -1 for error or the file size for success
---------------------------------------------------------------------------*/
int fatRead(FileHandle *handle, uint8_t *buffer, uint32_t bufferSize)
{
    if(bufferSize >= handle->FileSize){
        uint32_t clusterId = handle->startingCluster;
        uint32_t read = 0;
        uint32_t i;
        while(clusterId < FAT32_LAST_CLUSTER){
            putStr("file name = ");
            for(i =0; i < 11; i++){
              uart_putc(handle->fileName[i]);
            }
            putStr(", cluster = ");
            hexstring(clusterId);
            uart_putc('\n');
            read += readCluster(clusterId, buffer+read);
            clusterId = nextFatEntry(clusterId);
        }
        return handle->FileSize;
    }
    return -1;
} // End fatRead()
Пример #7
0
int main (int argc, const char * argv[]) {
	FILE* fp;// = fopen("samplefat.bin", "rb");

	if (argc == 2) {
		fp = fopen(argv[1], "rb");
		if(fp == NULL)
		{
			printf("Invalid file path.\n");
			return 0;
		}
	}
	else {
		printf("usage: %s %s\n", argv[0], "sample.bin");
		return 1;
	}
	
	BootStrapSector bss;
	readBootStrapSector(&bss, fp);

	if(bss.magic55AA[0] != 0x55 || bss.magic55AA[1] !=0xAA)
	{
		printf("Invalid FAT-12 file.\n");
		return 1;
	}

	sector_t rootDirectorySector = FIRST_FAT_SECTOR + bss.numSectorsInFAT * bss.numCopiesFAT;
	size_t numSectorsInDirectory = bss.numEntriesRootDir * 32 / bss.numBytesPerSector;
	sector_t firstClusterSector = rootDirectorySector + numSectorsInDirectory;
	seekToSector(fp, rootDirectorySector, bss.numBytesPerSector);
	
	// Extract
	int i;
	int fileCounter = 0;

	seekToSector(fp, rootDirectorySector, bss.numBytesPerSector);
	printf("Extracting...\n");	
	
	for (i = 0; i < bss.numEntriesRootDir; i++)
	{
		DirectoryEntry de;
		readDirectoryEntry(&de, fp);
		if (isFile(&de))
		{
			fileCounter++;
			long offsetToNextDirectoryEntry = ftell(fp);
			printf("%s.%s%s", de.filename, de.file_extension, (i < bss.numEntriesRootDir ? ", " : "\n"));
			FILE* fat_file_p = fopen(de.filename, "wb");
			UINT16 curCluster = de.start_cluster;
			//printf("%x\n", curCluster);
			BYTE buffer[bss.numBytesPerSector * bss.numSectorsPerCluster];
			int fileSize = de.file_size;
			while (curCluster < 0xFF8 && fileSize > 0)
			{
				readCluster(fp, curCluster, firstClusterSector, bss.numBytesPerSector, bss.numSectorsPerCluster, buffer);
				//}
				if(fileSize < bss.numBytesPerSector * bss.numSectorsPerCluster)
				{
					fwrite(buffer, sizeof(BYTE), fileSize, fat_file_p);
				}
				else
				{
					fwrite(buffer, sizeof(BYTE), sizeof(buffer), fat_file_p);
				}
				
				seekToSector(fp, FIRST_FAT_SECTOR, bss.numBytesPerSector);
				curCluster = extract12File(fp, curCluster);
				fileSize -= bss.numBytesPerSector * bss.numSectorsPerCluster;
			}
			fclose(fat_file_p);
			fseek(fp, offsetToNextDirectoryEntry, SEEK_SET);
		}
	}
	printf("\nExtracted: %i files\n", fileCounter);

	fclose(fp);

    return 0;
}
Пример #8
0
SigDenseSet * hairCut(int flag, char *cluster_filename, int par_haircut,SigDenseSet *sds){
  Graph *g;
  Node *node;
  SigDense *sd;
  int r,i;
  	char line[MAXLINE];
	char clusterName[10];
	char edgesNumber[10];
	char dump[10];
  Node **removelist = new Node*[1000];
  for(r=0;r<1000;r++){
	  removelist[r]=NULL;
  }

  if(flag==0){ //einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio
	  sds = initSigDenseSet();
		FILE *fp = fopen(cluster_filename, "r");
		if(fp == NULL){
			 cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl;
			 system("pause");
		}

		while(fgets(line, MAXLINE, fp)){

			if (line[strlen(line)-1] == '\n')
			  line[strlen(line)-1] = STREND;
			sscanf (line,"%s %s %s",clusterName,dump,edgesNumber);  //diavazei tin proti grammi tou kathe cluster
			g=readCluster(fp, edgesNumber);							//(format:#cluster : #edges)

			r = 0;												//vriskei poies korifes tou cluster exoun mikrotero degree
			for (node = g->nodes; node != NULL; node = node->next){
				if (node->degree < par_haircut){
				removelist[r++] = node;//cout<<"eppppp "<< node->label<<endl;system("pause");
				}
			}

			if (r){								//an iparxoun nodes sto removelist...svistous!
				for (i=0; i<r; i++)
				removeNode(g, removelist[i]);
			}
			if(g->nodecount!=0){
			SigDense *sd = new SigDense();		// apothikeuse to ipoloipo ton clusters sti lista
			sd->sg       = g;
			insertSigDense(sds, sd);
			}
						
		}
		fclose (fp);
	}
  	else if(flag==1){			//den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds
		for (sd = sds->first->next; sd != NULL; sd=sd->next){
			r = 0;												//vriskei poies korifes tou cluster exoun mikrotero degree
			for (node = sd->sg->nodes; node != NULL; node = node->next){
				if (node->degree < par_haircut){
				removelist[r++] = node;//cout<<"eppppp "<< node->label<<endl;system("pause");
				}
			}

			if (r){								//an iparxoun nodes sto removelist...svistous!
				for (i=0; i<r; i++)
				removeNode(sd->sg, removelist[i]);
			}
			if(g->nodecount==0){
				sd->prev->next=sd->next;			// an 0 nodes, parekampse ton. PROSOXI!!dimiourgia skoupidion(den svino)
				if(sd->next!=NULL)
				sd->next->prev=sd->prev;
			}
		}
	}
	delete removelist;

	return sds;
}
Пример #9
0
SigDenseSet * bestneighbor(int flag,char *initial_filename,char *cluster_filename,float par_bestneighb,SigDenseSet *sds){
	Graph *g,*tg;
	SigDense *sd;
	Node *node, *tnode,*nnode,*tnode2;
	char line[MAXLINE];
	char clusterName[10];
	char edgesNumber[10];
	char dump[10];
	int orig_degree=0,r,numb_neigh,exist,good_neigh;
	float score;
	Edge *edge,*nedge;

	g=readGraph(initial_filename);	//kataskeui tou arxikou grafou

	Node **neighborlist = new Node*[g->nodecount];
  for(r=0;r<g->nodecount;r++){
	  neighborlist[r]=NULL;
  }
	

	if(flag==0){	//einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio
		sds = initSigDenseSet();
		FILE *fp = fopen(cluster_filename, "r");
		if(fp == NULL){
			 cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl;
			 system("pause");
		}

		while(fgets(line, MAXLINE, fp)){

			if (line[strlen(line)-1] == '\n')
			  line[strlen(line)-1] = STREND;
			sscanf (line,"%s %s %s",clusterName,dump,edgesNumber);  //diavazei tin proti grammi tou kathe cluster
			tg=readCluster(fp, edgesNumber);							//(format:#cluster : #edges)

			numb_neigh=0;exist=0;score=0;good_neigh=0;
			for(tnode=tg->nodes;tnode!=NULL;tnode=tnode->next){		//euresi ton geitonon ston arxiko grafo
				for(node=g->nodes;node!=NULL;node=node->next){	//
					if(strcmp(node->label,tnode->label)==0){
						for(edge=node->edges;edge!=NULL;edge=edge->next){
							nnode=edge->partner;
							for(r=0;r<numb_neigh;r++){//elegxos mipos exei xanasinatithei o geitonas
								if(strcmp(neighborlist[r]->label,nnode->label)==0){
									exist=1;
									break;
								}
							}
							for(tnode2=tg->nodes;tnode2!=NULL;tnode2=tnode2->next){//elegxos mipos o geitonas anikei ston grafo
										if(strcmp(nnode->label,tnode2->label)==0){
											exist=1;
											break;
										}
							}
							if(exist==0){//an oxi, ton prosthetoume ston pinaka geitonon kai vlepoume an einai best
								neighborlist[numb_neigh]=nnode;
								for(nedge=neighborlist[numb_neigh]->edges;nedge!=NULL;nedge=nedge->next){//ipologismos ton "kalon" edges
									for(tnode2=tg->nodes;tnode2!=NULL;tnode2=tnode2->next){
										if(strcmp(nedge->partner->label,tnode2->label)==0){
											score++;
											break;
										}
									}
								}
								if(score/neighborlist[numb_neigh]->degree>=par_bestneighb){//an mas kanei, vazoume part=1
									neighborlist[numb_neigh]->part=1;
									good_neigh++;
								//	cout<<"enas kalos komvos einai o: "<< neighborlist[numb_neigh]->label<< "me degree"<<neighborlist[numb_neigh]->degree<<endl;system("pause");
								}								
								numb_neigh++;
								score=0;
							}
							exist=0;
						}
						break;
					}
				}
			}
			
			for(r=0;r<numb_neigh;r++){			//prosthetoume tous kalous geitones ston cluster
				if(neighborlist[r]->part==1){
					Node *new_node;
					new_node=addNode(tg,neighborlist[r]->label);
				}
			}

			tnode=tg->nodes;
			for(r=0;r<good_neigh;r++){//cout<<"ok "<<tnode->label<<endl;system("pause");		// prosthetoume tis edges gia tous kainourgious komvous
				for(node=g->nodes;node!=NULL;node=node->next){//cout<<"ok2"<<endl;system("pause");	//
					if(strcmp(node->label,tnode->label)==0){//cout<<"ok3"<<endl;system("pause");
						for(edge=node->edges;edge!=NULL;edge=edge->next){//cout<<"ok4"<<endl;system("pause");
							for(tnode2=tg->nodes;tnode2!=NULL;tnode2=tnode2->next){//cout<<"ok5"<<endl;system("pause");
								if(strcmp(edge->partner->label,tnode2->label)==0){//cout<<"ok6"<<endl;system("pause");
									addEdge(tg,tnode,tnode2,edge->weight);
									addEdge(tg,tnode2,tnode,edge->weight);
								}
							}
						}
						break;
					}
				}
				tnode=tnode->next;
			}

			if(g->nodecount!=0){
			SigDense *sd = new SigDense();		// apothikeuse to ipoloipo ton clusters sti lista
			sd->sg       = tg;
			insertSigDense(sds, sd);
			}
		}
		fclose(fp);
	}
	else if(flag==1){			//den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds
		
		for (sd = sds->first->next; sd != NULL; sd=sd->next){
		numb_neigh=0;exist=0;score=0;good_neigh=0;
			for(tnode=sd->sg->nodes;tnode!=NULL;tnode=tnode->next){		//euresi ton geitonon ston arxiko grafo
				for(node=g->nodes;node!=NULL;node=node->next){	//
					if(strcmp(node->label,tnode->label)==0){
						for(edge=node->edges;edge!=NULL;edge=edge->next){
							nnode=edge->partner;
							for(r=0;r<numb_neigh;r++){//elegxos mipos exei xanasinatithei o geitonas
								if(strcmp(neighborlist[r]->label,nnode->label)==0){
									exist=1;
									break;
								}
							}
							for(tnode2=sd->sg->nodes;tnode2!=NULL;tnode2=tnode2->next){//elegxos mipos o geitonas anikei ston grafo
										if(strcmp(nnode->label,tnode2->label)==0){
											exist=1;
											break;
										}
							}
							if(exist==0){//an oxi, ton prosthetoume ston pinaka geitonon kai vlepoume an einai best
								neighborlist[numb_neigh]=nnode;
								for(nedge=neighborlist[numb_neigh]->edges;nedge!=NULL;nedge=nedge->next){//ipologismos ton "kalon" edges
									for(tnode2=sd->sg->nodes;tnode2!=NULL;tnode2=tnode2->next){
										if(strcmp(nedge->partner->label,tnode2->label)==0){
											score++;
											break;
										}
									}
								}
								if(score/neighborlist[numb_neigh]->degree>=par_bestneighb){//an mas kanei, vazoume part=1
									neighborlist[numb_neigh]->part=1;
									good_neigh++;
								//	cout<<"enas kalos komvos einai o: "<< neighborlist[numb_neigh]->label<< "me degree"<<neighborlist[numb_neigh]->degree<<endl;system("pause");
								}								
								numb_neigh++;
								score=0;
							}
							exist=0;
						}
						break;
					}
				}
			}
			
			for(r=0;r<numb_neigh;r++){			//prosthetoume tous kalous geitones ston cluster
				if(neighborlist[r]->part==1){
					Node *new_node;
					new_node=addNode(sd->sg,neighborlist[r]->label);
				}
			}

			tnode=sd->sg->nodes;
			for(r=0;r<good_neigh;r++){//cout<<"ok "<<tnode->label<<endl;system("pause");		// prosthetoume tis edges gia tous kainourgious komvous
				for(node=g->nodes;node!=NULL;node=node->next){//cout<<"ok2"<<endl;system("pause");	//
					if(strcmp(node->label,tnode->label)==0){//cout<<"ok3"<<endl;system("pause");
						for(edge=node->edges;edge!=NULL;edge=edge->next){//cout<<"ok4"<<endl;system("pause");
							for(tnode2=sd->sg->nodes;tnode2!=NULL;tnode2=tnode2->next){//cout<<"ok5"<<endl;system("pause");
								if(strcmp(edge->partner->label,tnode2->label)==0){//cout<<"ok6"<<endl;system("pause");
									addEdge(sd->sg,tnode,tnode2,edge->weight);
									addEdge(sd->sg,tnode2,tnode,edge->weight);
								}
							}
						}
						break;
					}
				}
				tnode=tnode->next;
			}
		}
	}
	else{
		cout<<"The flag is WRONG in density function"<<endl;
		system("pause");
	}
	delete neighborlist;
	return sds;
}
Пример #10
0
SigDenseSet * outInside(int flag,char *initial_filename,char *cluster_filename,float par_out_in,SigDenseSet *sds){
	Graph *g,*tg;
	SigDense *sd;
	Node *node, *tnode;
	char line[MAXLINE];
	char clusterName[10];
	char edgesNumber[10];
	char dump[10];
	int orig_degree=0;

	g=readGraph(initial_filename);	//kataskeui tou arxikou grafou
	

	if(flag==0){	//einai i proti methodos pou efarmozetai, diavasma apo to intermediate arxeio
		sds = initSigDenseSet();
		FILE *fp = fopen(cluster_filename, "r");
		if(fp == NULL){
			 cout<<"File "<<cluster_filename<< " could not be opened in density function"<<endl;
			 system("pause");
		}

		while(fgets(line, MAXLINE, fp)){

			if (line[strlen(line)-1] == '\n')
			  line[strlen(line)-1] = STREND;
			sscanf (line,"%s %s %s",clusterName,dump,edgesNumber);  //diavazei tin proti grammi tou kathe cluster
			tg=readCluster(fp, edgesNumber);							//(format:#cluster : #edges)
//cout<<"elegxos tou cluster  "<<tg->nodes->label<<endl;
			for(tnode=tg->nodes;tnode!=NULL;tnode=tnode->next){		//ipologismos tou sinolikou degree ton korifon pou apoteloun ton cluster
				for(node=g->nodes;node!=NULL;node=node->next){	//
					if(strcmp(node->label,tnode->label)==0){
						orig_degree+=node->degree;
						break;
					}
				}
			}
//cout<<"exoume kai leme: orig_degree= "<<orig_degree<<"   kai ta in= "<<tg->edgecount<<endl<<(float)tg->edgecount/(float)orig_degree<<endl;
			if((float)(tg->edgecount/(float)orig_degree)>=par_out_in){					//elegxos an einai piknos i oxi o cluster.
				SigDense *sd = new SigDense();		// an nai apothikeuse allios katestrepse
				sd->sg       = tg;
				insertSigDense(sds, sd);
				orig_degree=0;
			}
			else{
				destroyGraph(tg);
				orig_degree=0;
			}
		}
		fclose (fp);
	}
	else if(flag==1){				//den einai i proti methodos pou efarmozetai, opote idi exei dimiourgithei lista sds
		
		for (sd = sds->first->next; sd != NULL; sd=sd->next){

			for(tnode=sd->sg->nodes;tnode!=NULL;tnode=tnode->next){		//ipologismos tou sinolikou degree ton korifon pou apoteloun ton cluster
				for(node=g->nodes;node!=NULL;node=node->next){	//
					if(strcmp(node->label,tnode->label)==0){
						orig_degree+=node->degree;
						break;
					}
				}
			}
			if(sd->sg->nodecount<2 || (float)sd->sg->edgecount/orig_degree<par_out_in){			//elegxos 
				sd->prev->next=sd->next;			// an oxi, parekampse ton. PROSOXI!!dimiourgia skoupidion(den svino)
				if(sd->next!=NULL)
				sd->next->prev=sd->prev;
			}
			orig_degree=0;

		}
	}
	else{
		cout<<"The flag is WRONG in density function"<<endl;
		system("pause");
	}
	return sds;
}