Exemplo n.º 1
0
int main(int argc, char *argv[])
{
  struct tree at;
  int op,lr,parent,child;

  initTree(&at);
  
  while(scanf("%d",&op)==1 && op!=0){
    switch(op){
      case 1://insert node
        scanf("%d%d%d",&parent,&lr,&child);
        printf("insert node(p=%d lr=%d c=%d):",parent,lr,child);
        if(insertTreeNode(&at,parent,lr,child)){
          printf("success\n");
        }else{
          printf("fail\n");
        }
        break;
      case 2://breadfirst traversal
        printf("breadthfirst:");
        breadthFirstTraversal(&at);
        printf("\n");
        break;
      case 3://pre order traversal
        printf("depth preorder:");
        depthFirstTraversal(&at,PREORDER);
        printf("\n");
        break;
      case 4://in order traversal
        printf("depth inorder:");
        depthFirstTraversal(&at,INORDER);
        printf("\n");
        break;
      case 5://post order traversal
        printf("depth postorder:");
        depthFirstTraversal(&at,POSTORDER);
        printf("\n");
        break;
      default:
        printf("error operator\n");
        break;
    }
  }
  
  releaseTree(&at);
  
  return 0;
}
Exemplo n.º 2
0
void depthFirstTraversal(jitdata* jd, basicblock* block)
{
	block->ld->semi = ++jd->ld->n;
	jd->ld->vertex.push_back(block);
	block->ld->label = block;

	// Check if jd->ld->vertex[jd->ld->n] == block
	assert(static_cast<s4>(jd->ld->vertex.size()) == jd->ld->n + 1);
	
	for (s4 i = 0; i < block->successorcount; i++)
	{
		basicblock* successor = block->successors[i];

		if (successor->ld->semi == 0)   // visited the first time?
		{
			successor->ld->parent = block;
			depthFirstTraversal(jd, successor);
		}
		else   // back edge found
		{
			jd->ld->depthBackEdges.push_back(Edge(block, successor));
		}

		successor->ld->pred.push_back(block);
	}
}
Exemplo n.º 3
0
/**
 * Calculates the immediate dominators of all basicblocks.
 */
void calculateDominators(jitdata* jd)
{
	assert(jd->ld->root);

	/******************
	 *     Step 1     *
	 ******************/

	// Insert an arbitrary element so that the first real item has index 1. This simplifies the implementation.
	jd->ld->vertex.push_back(0);

	assert(jd->ld->vertex.size() == 1);

	for (basicblock* block = jd->basicblocks; block != 0; block = block->next)
	{
		block->ld = new BasicblockLoopData;
	}

	// jd->ld->root is not contained in the linked list jd->basicblocks.
	jd->ld->root->ld = new BasicblockLoopData;
	
	depthFirstTraversal(jd, jd->ld->root);

	assert(static_cast<s4>(jd->ld->vertex.size()) == jd->ld->n + 1);
	for (s4 i = jd->ld->n; i >= 2; i--)
	{
		basicblock* w = jd->ld->vertex[i];

		/******************
		 *     Step 2     *
		 ******************/

		typedef std::vector<basicblock*>::iterator Iterator;

		for (Iterator it = w->ld->pred.begin(); it != w->ld->pred.end(); ++it)
		{
			basicblock* v = *it;

			basicblock* u = eval(v);
			if (u->ld->semi < w->ld->semi)
				w->ld->semi = u->ld->semi;
		}

		jd->ld->vertex[w->ld->semi]->ld->bucket.push_back(w);
		link(w->ld->parent, w);

		/******************
		 *     Step 3     *
		 ******************/

		std::vector<basicblock*>& bucket = w->ld->parent->ld->bucket;
		for (Iterator it = bucket.begin(); it != bucket.end(); ++it)
		{
			basicblock* v = *it;

			basicblock* u = eval(v);
			if (u->ld->semi < v->ld->semi)
				v->ld->dom = u;
			else
				v->ld->dom = w->ld->parent;
		}
		bucket.clear();
	}

	/******************
	 *     Step 4     *
	 ******************/

	for (s4 i = 2; i <= jd->ld->n; i++)
	{
		basicblock* w = jd->ld->vertex[i];

		if (w->ld->dom != jd->ld->vertex[w->ld->semi])
			w->ld->dom = w->ld->dom->ld->dom;
	}
	jd->ld->root->ld->dom = 0;
}
Exemplo n.º 4
0
int main() {
	printf("\nCOMP2000 Assignment 5\n\nStudent # : 812000767\n\n\n\n********** Graph ************* \n\n\n");

	FILE*in = fopen("input.txt", "r");
	FILE*out = fopen("output.txt", "w");


	// part (a)
	char word[MaxWordSize] = { '\0' };
	int numVertices = 0;
	fscanf(in, "%s", &word);


	while (strcmp(word,"END") != 0){
		numVertices++; //  getting the number of vertices's
		insertNode(&rootPtr, word);
		fscanf(in, "%s", &word);
	}

	Graph G = newGraph(numVertices);
	buildGraph(in, G);
	printGraph(out, G);

	// end part (a)
	printf("-> Part (a) finished ... \n\n");
	// part b
	fscanf(in, "%s", &word);
	search(rootPtr, word);
	depthFirstTraversal(out, G, Placement);
	breadthFirstTraversal(out, G, Placement);

	fscanf(in, "%s", &word);
	search(rootPtr, word);
	depthFirstTraversal(out, G, Placement);
	breadthFirstTraversal(out, G, Placement);
	fprintf(out, "\n");
	fprintf(out, "\n");
	// end part b
	printf("-> Part (b) finished ... \n\n");
	// part (c)
	fscanf(in, "%s", &word);
	while (strcmp(word, "END") != 0){
		search(rootPtr, word);
		fprintf(out, "Minimal cost path from %s:\n", word);
		Dijkstra(out, G, Placement, word);
		fscanf(in, "%s", &word);
		Placement = 0;
		fprintf(out, "\n");
	}
	// end part (c)
	printf("-> Part (c) finished ... \n\n");

	Placement = j = order = 0;


	fclose(in);
	fclose(out);

	printf("********* Finished ***********\n\n");

	system("PAUSE");
	return 0;

}