/* Retorna um nó com o menor elemento da lista apontada por inicio, e guarda nesse nó uma lista com todos os nós que foram comparados com ele */
PNo menorElemento(PPNo inicio) {
	PNo aux, prox, menor_anterior;
	
	aux = prox = *inicio;
	menor_anterior = NULL;
	while(aux != NULL && prox != NULL) { /* laço que percorre a lista até o fim */
		prox = aux->prox;
		if(prox) { /* se prox nao apontar para NULL, é porque aux aponta para um nó e prox para outro e podemos comparar os dois */
			comps++; /* conta mais uma comparação */
			if(aux->valor < prox->valor) { /* se o valor do nó apontado por aux for maior que que o valor de prox */
				insereValor(&aux->maiores,prox->valor); /* insere o valor do nó maior (apontado por prox) na lista de valores maiores do nó 
															apontado por aux */
				if(menor_anterior) menor_anterior->prox = aux; /* se menor_anterior estiver setado, ele passa a apontar para aux (que é o menor valor) */
				aux->prox = NULL; /* aux passa a ser o final da lista ligada (evita problemas de loop infinito em caso de lista com nº de nós impar) */
				menor_anterior = aux; /* salva o ponteiro aux em menor_anterior, pois ele vai apontar para o proximo nó menor na proxima comparação */
				aux = prox->prox;
			}
			else { /* nó prox é maior que nó aux */
				insereValor(&prox->maiores,aux->valor); /* insere o valor do nó maior (apontado por prox) na lista de valores maiores do nó 
															apontado por aux */
				if(menor_anterior) menor_anterior->prox = prox; /* se menor_anterior estiver setado, ele passa a apontar parar prox (que é o menor valor) */
				else *inicio = prox; /* se não, o ponteiro para o inicio da lista passa a apontar para o prox */
				menor_anterior = prox; /* salva o endereço apontado por prox em menor_anterior */
				aux = prox->prox;
			}
		}else { /* se prox nao existe */
			if (menor_anterior) menor_anterior->prox = aux; /* se menor_anterior nao for NULL, o nó apontado por ele passa a apontar para aux */
			aux = NULL; /* seta aux como NULL para sair do laço */
		}
		
	}
	
	if((*inicio)->prox) { /* se a lista tiver mais que dois nós */
		return menorElemento(inicio); /* chama a mesma função recursivamente */
	}else {
		return *inicio; /* o nó que sobrou, é o menor da lista. Retorna ele. */
	}
}
int main(int argc,char* argv[]) {
	int n, i, num;
	PPNo lista;
	PNo menor;
	
	lista = (PPNo) malloc(sizeof(PNo));
	*lista = NULL;
	
	scanf("%d",&n);
	for(i=0;i<n;i++) {
		scanf("%d",&num);
		insereValor(lista,num);
	}
	
	printf("Procurando segundo menor elemento na lista: ");
	imprime(lista);
	menor = menorElemento(lista);
	printf("Menor elemento: %d (comparacoes: %d de %d)\n",menor->valor,comps,maxComps(n));
	if (menor->maiores) { 
		menor = menorElemento(&(menor->maiores));
		printf("Segundo menor: %d (comparacoes: %d de %d)",menor->valor,comps,maxComps(n));	
	}
	return 0;
}
예제 #3
0
int main(/*int rg ,char *nomeTabela[]*/){
	
	int erro;

	table *t = NULL;
	column *c = NULL;

	t = iniciaTabela("Pesso");

	if(t == ERRO_NOME_TABELA_INVALIDO){
		printf("Erro: na função iniciaTabela(). Nome da tabela já existente.\n");
		return 0;
	}

	t = adicionaCampo(t, "Nome", 'S', 20);
	t = adicionaCampo(t, "Idade", 'I', (sizeof(int)));
	t = adicionaCampo(t, "Sexo", 'C', (sizeof(char)));
	t = adicionaCampo(t, "Media", 'D', (sizeof(double)));
	t = adicionaCampo(t, "Obs", 'S', 40);
	t = adicionaChavePrimaria(t,"Nome");
	t = adicionaChaveEstrangeira(t,"Nome","Pessoa");

	erro = finalizaTabela(t);

	if(erro != SUCCESS){
		printf("Erro %d: na função finalizaTabela().\n", erro);
		return 0;
	}
	
	c = insereValor(c, "Nome", "Um"); 
	c = insereValor(c, "Idade", "40");
	c = insereValor(c, "Sexo", "F");
	c = insereValor(c, "Media", "2.5");
	c = insereValor(c, "Obs", "Obs. Um");
	

	c = insereValor(c, "Nome", "Dois");
	c = insereValor(c, "Idade", "40");
	c = insereValor(c, "Sexo", "M");
	c = insereValor(c, "Media", "1.67");
	c = insereValor(c, "Obs", "Obs. Dois");


	c = insereValor(c, "Nome", "Dois");
	c = insereValor(c, "Idade", "40");
	c = insereValor(c, "Sexo", "F");
	c = insereValor(c, "Media", "1.456");
	c = insereValor(c, "Obs", "Obs. Três");

	erro = finalizaInsert("Pesso", c);
	
	t = iniciaTabela("Pessoa");

	if(t == ERRO_NOME_TABELA_INVALIDO){
		printf("Erro: na função iniciaTabela(). Nome da tabela já existente.\n");
		return 0;
	}

	t = adicionaCampo(t, "Nome", 'S', 20);
	t = adicionaCampo(t, "Idade", 'I', (sizeof(int)));
	t = adicionaCampo(t, "Sexo", 'C', (sizeof(char)));
	t = adicionaCampo(t, "Media", 'D', (sizeof(double)));
	t = adicionaCampo(t, "Obs", 'S', 40);
	t = adicionaChavePrimaria(t,"Nome");
	t = adicionaChaveEstrangeira(t,"Nome","Pesso");

	erro = finalizaTabela(t);

	if(erro != SUCCESS){
		printf("Erro %d: na função finalizaTabela().\n", erro);
		return 0;
	}
	
	c = insereValor(c, "Nome", "Um"); 
	c = insereValor(c, "Idade", "40");
	c = insereValor(c, "Sexo", "F");
	c = insereValor(c, "Media", "2.5");
	c = insereValor(c, "Obs", "Obs. Um");
	

	c = insereValor(c, "Nome", "Dois");
	c = insereValor(c, "Idade", "40");
	c = insereValor(c, "Sexo", "M");
	c = insereValor(c, "Media", "1.67");
	c = insereValor(c, "Obs", "Obs. Dois");


	c = insereValor(c, "Nome", "Dois");
	c = insereValor(c, "Idade", "40");
	c = insereValor(c, "Sexo", "F");
	c = insereValor(c, "Media", "1.456");
	c = insereValor(c, "Obs", "Obs. Três");

	erro = finalizaInsert("Pessoa", c);
/*
	if(erro != SUCCESS){
		printf("Erro %d: na função finalizaInsert()\n", erro);
		return 0;
	}


	if(rg == 1){
		printf("Erro: nome de tabela nao inserido na linha de comando.\n");
		return 0;
	}

	struct fs_objects objeto = leObjeto(nomeTabela[1]);	
	
	tp_table *esquema = leSchema(objeto);

	if(esquema == ERRO_ABRIR_ESQUEMA){
		printf("Erro ao criar o esquema.\n");
		return 0;
	}

	tp_buffer *bufferpoll = initbuffer();

	if(bufferpoll == ERRO_DE_ALOCACAO){
		printf("Erro ao alocar memória para o buffer.\n");
		return 0;
	}

	erro = colocaTuplaBuffer(bufferpoll, 0, esquema, objeto);

	if(erro != SUCCESS){
		printf("Erro %d: na função colocaTuplaBuffer().\n", erro);
		return 0;
	}
	
	erro = colocaTuplaBuffer(bufferpoll, 1, esquema, objeto);

	if(erro != SUCCESS){
		printf("Erro %d: na função colocaTuplaBuffer().\n", erro);
		return 0;
	}
	
	erro = colocaTuplaBuffer(bufferpoll, 2, esquema, objeto);

	if(erro != SUCCESS){
		printf("Erro %d: na função colocaTuplaBuffer().\n", erro);
		return 0;
	}
	
	column *tuplaE = excluirTuplaBuffer(bufferpoll, esquema, objeto, 0, 2); //pg, tupla
	column *pagina = getPage(bufferpoll, esquema, objeto, 0);

	if(tuplaE == ERRO_PARAMETRO){
		printf("Erro, na função excluirTuplaBuffer(), problemas no parametro.\n");
		return 0;
	}
	if(pagina == ERRO_PARAMETRO){
		printf("Erro, na função getPage(), problemas no parametro.\n");
		return 0;
	}
	
	// PARA IMPRIMIR TUPLA EXCLUIDA -----------------------------
	//-------------------------------------------------------------
	printf("\nTupla excluída do Buffer.\n");
	int j = 0;
	for(j=0; j < objeto.qtdCampos; j++){
		
		if(tuplaE[j].tipoCampo == 'S')
			printf("%s: %s ", tuplaE[j].nomeCampo,tuplaE[j].valorCampo);
		else if(tuplaE[j].tipoCampo == 'I'){
			int *n = (int *)&tuplaE[j].valorCampo[0];
			printf("%s: %d ",tuplaE[j].nomeCampo, *n);
		}
		else if(tuplaE[j].tipoCampo == 'C'){
			printf("%s: %c ",tuplaE[j].nomeCampo, tuplaE[j].valorCampo[0]);
		}
		else if(tuplaE[j].tipoCampo == 'D'){
			double *n = (double *)&tuplaE[j].valorCampo[0];
			printf("%s: %f ",tuplaE[j].nomeCampo, *n);
		}
		printf("\n");
	}
	
	//-------------------------------------------------------------

	// PARA IMPRIMIR PÁGINA ---------------------------------------
	//-------------------------------------------------------------
	printf("\nPágina armazenada na estrutura column *pagina.\n");
	for(j=0; j < objeto.qtdCampos*bufferpoll[0].nrec; j++){
		
		if(pagina[j].tipoCampo == 'S')
			printf("%s: %s ", pagina[j].nomeCampo,pagina[j].valorCampo);
		else if(pagina[j].tipoCampo == 'I'){
			int *n = (int *)&pagina[j].valorCampo[0];
			printf("%s: %d ",pagina[j].nomeCampo, *n);
		}
		else if(pagina[j].tipoCampo == 'C'){
			printf("%s: %c ",pagina[j].nomeCampo, pagina[j].valorCampo[0]);
		}
		else if(pagina[j].tipoCampo == 'D'){
			double *n = (double *)&pagina[j].valorCampo[0];
			printf("%s: %f ",pagina[j].nomeCampo, *n);
		}
		printf("\n");
	}
	printf("\n\n");
	
	//-------------------------------------------------------------
	

	erro = printbufferpoll(bufferpoll, esquema, objeto, 0);

	if(erro != SUCCESS){
		printf("Erro %d: na função printbufferpoll().\n", erro);
		return 0;
	}
*/
	return 0;
}
예제 #4
0
int main () {
    int numLinhas, numColunas;
    printf ("Escolha o tamanho da matriz esparsa (MxN) > ");
    scanf ("%d %d", &numLinhas, &numColunas);

    if (numLinhas <= 0 || numColunas <= 0) {
        fprintf (stderr, "Matriz não pode ter dimensão menor que 1\n");
        return -1;
    }

    matrizEsparsa *mat = criaMatrizEsparsa (numLinhas, numColunas);

    int opcao, y, x, ret;
    double valor;
    double det;
    do {
        menu ();
        scanf ("%d", &opcao);

        switch (opcao) {
        case 1:
            printf ("Escolha a posição da matriz a ser consultada (MxN) > ");
            scanf ("%d %d", &y, &x);
            ret = consultaValor (mat, y, x);
            if (ret != ERRO) {
                printf ("Matriz[%d][%d] = %d\n", y, x, ret);
            }
            break;

        case 2:
            printf ("Escolha o valor a ser inserido > ");
            scanf ("%lf", &valor);
            printf ("Escolha em que posição da matriz o valor será inserido (MxN) > ");
            scanf ("%d %d", &y, &x);
            if (insereValor (mat, y, x, valor) != ERRO) {
                printf ("Valor %6.3lf inserido em %dx%d\n", valor, y, x);
            }
            break;

        case 3:
            printf ("Escolha a linha a ser somada > ");
            scanf ("%d", &y);
            ret = somaLinha (mat, y);
            if (ret != ERRO) {
                printf ("Soma da linha %d = %d\n", y, ret);
            }
            break;

        case 4:
            printf ("Escolha a coluna a ser somada > ");
            scanf ("%d", &x);
            ret = somaColuna (mat, x);
            if (ret != ERRO) {
                printf ("Soma da coluna %d = %d\n", x, ret);
            }
            break;

        case 5:
            printMatriz (mat);
            break;

        case 6:
            det = determinante (mat);
            if (det != ERRO) {
                printf ("Determinante da matriz = %f", det);
            }
            break;

        case 7:
            gaussSeidel (mat);
            break;

        }

        puts ("");
    } while (opcao != 0);

    apagaMatrizEsparsa (mat);
    return 0;
}
예제 #5
0
void example()
{
	int ok = checkCreateDB("UFFS");//cria banco caso não exista

	current_database = busca("UFFS",1);

	if (!ok)
	{	
	    int nrTabelas = 3;
	    int nTabela[nrTabelas];
	    table  *tab[nrTabelas]; 
	    column *colunas;
	    int object, schema;
	    
	    object      = existeArquivo("fs_object.dat");
	    schema      = existeArquivo("fs_schema.dat");
	   
	    nTabela[0]  = existeArquivo(table_name_real("Aluno",current_database));
	    
	    nTabela[1]  = existeArquivo(table_name_real("Inst",current_database));

	    nTabela[2]  = existeArquivo(table_name_real("Inscri",current_database));


        if(!nTabela[0]){ 
    		
            tab[0] = iniciaTabela(table_name_real("Aluno",current_database));                //Cria a tabela 
            tab[0] = adicionaCampo(tab[0], "CPF"     , 'I', (sizeof(int))   ,PK,"","");     //Cria os atributos
            tab[0] = adicionaCampo(tab[0], "Nome"    , 'S', 20              ,NPK,"","");        
            tab[0] = adicionaCampo(tab[0], "Endereco", 'S', 20              ,NPK,"","");
            tab[0] = adicionaCampo(tab[0], "Peso"    , 'D', (sizeof(double)),NPK,"","");
            finalizaTabela(tab[0],current_database);
            
         }
         if(!nTabela[1]){   
         	
            tab[1] = iniciaTabela(table_name_real("Inst",current_database)); 
            tab[1] = adicionaCampo(tab[1], "CodInst"  , 'I', (sizeof(int))   ,PK , "","");
            tab[1] = adicionaCampo(tab[1], "Nome"     , 'S', 20              ,NPK, "","");
            tab[1] = adicionaCampo(tab[1], "Endereco" , 'S', 20              ,NPK, "","");
            tab[1] = adicionaCampo(tab[1], "Reitor"   , 'S', 10              ,NPK, "","");
            finalizaTabela(tab[1],current_database);
        }
        if(!nTabela[2]){
        	
            tab[2] = iniciaTabela(table_name_real("Inscri",current_database)); 
            tab[2] = adicionaCampo(tab[2], "CodMat"     , 'I', (sizeof(int))  ,PK, "","");
            tab[2] = adicionaCampo(tab[2], "CPF"        , 'I', (sizeof(int))  ,FK, table_name_real("Aluno",current_database),"CPF");
            tab[2] = adicionaCampo(tab[2], "CodInst"    , 'I', (sizeof(int))  ,FK , table_name_real("Inst",current_database),"CodInst");
            tab[2] = adicionaCampo(tab[2], "Curso"   , 'S',  20  ,NPK,"","");
            finalizaTabela(tab[2],current_database);
        }
         
         //Inserção de tuplas na tabela1   
        colunas = NULL;     
        colunas = insereValor(tab[0],colunas, "CPF", "123456");
        colunas = insereValor(tab[0],colunas, "Nome", "Rogerio");
        colunas = insereValor(tab[0],colunas, "Endereco", "Rua Marechal");
        colunas = insereValor(tab[0],colunas, "Peso", "81.4");
        finalizaInsert(table_name_real("Aluno",current_database), colunas); 
        
        colunas = NULL;     
        colunas = insereValor(tab[0],colunas, "CPF", "654321");
        colunas = insereValor(tab[0],colunas, "Nome", "Ricardo");
        colunas = insereValor(tab[0],colunas, "Endereco", "RuaClevela");
        colunas = insereValor(tab[0],colunas, "Peso", "88.9");
        finalizaInsert(table_name_real("Aluno",current_database), colunas); 

        colunas = NULL;     
        colunas = insereValor(tab[0],colunas, "CPF", "1234567");
        colunas = insereValor(tab[0],colunas, "Nome", "Natan");
        colunas = insereValor(tab[0],colunas, "Endereco", "RuaDelmi");
        colunas = insereValor(tab[0],colunas, "Peso", "58.9");
        finalizaInsert(table_name_real("Aluno",current_database), colunas); 
            
        
        //Inserção de tuplas na tabela2 
        colunas = NULL;
        colunas = insereValor(tab[1],colunas, "CodInst", "111");
        colunas = insereValor(tab[1],colunas, "Nome", "UFFS");
        colunas = insereValor(tab[1],colunas, "Endereco", "RuadeTerra");
        colunas = insereValor(tab[1],colunas, "Reitor", "MandaChuva");
        finalizaInsert(table_name_real("Inst",current_database), colunas);
        
        colunas = NULL;
        colunas = insereValor(tab[1],colunas, "CodInst", "222");
        colunas = insereValor(tab[1],colunas, "Nome", "CEFET");
        colunas = insereValor(tab[1],colunas, "Endereco", "RuadePedra");
        colunas = insereValor(tab[1],colunas, "Reitor", "MandaVento");
        finalizaInsert(table_name_real("Inst",current_database), colunas);

        colunas = NULL;
        colunas = insereValor(tab[1],colunas, "CodInst", "333");
        colunas = insereValor(tab[1],colunas, "Nome", "UNOESC");
        colunas = insereValor(tab[1],colunas, "Endereco", "RuadeAsfal");
        colunas = insereValor(tab[1],colunas, "Reitor", "MandaAgua");
        finalizaInsert(table_name_real("Inst",current_database), colunas);
        
        
        
        //Inserção de tupla na tabela3
        colunas = NULL;
        colunas = insereValor(tab[2],colunas, "CodMat", "1401");
        colunas = insereValor(tab[2],colunas, "CPF", "123456");
        colunas = insereValor(tab[2],colunas, "CodInst", "333");
        colunas = insereValor(tab[2],colunas, "Curso", "CC");
        finalizaInsert(table_name_real("Inscri",current_database), colunas);
        
        colunas = NULL;
        colunas = insereValor(tab[2],colunas, "CodMat", "1402");
        colunas = insereValor(tab[2],colunas, "CPF", "654321");
        colunas = insereValor(tab[2],colunas, "CodInst", "222");
        colunas = insereValor(tab[2],colunas, "Curso", "CC");
        finalizaInsert(table_name_real("Inscri",current_database), colunas);
        
        colunas = NULL;
        colunas = insereValor(tab[2],colunas, "CodMat", "1403");
        colunas = insereValor(tab[2],colunas, "CPF", "1234567");
        colunas = insereValor(tab[2],colunas, "CodInst", "111");
        colunas = insereValor(tab[2],colunas, "Curso", "ADM");
        finalizaInsert(table_name_real("Inscri",current_database), colunas);
	}
  
    current_database = -1;//não existe nenhum banco logado
}