Advertisement
Guest User

code

a guest
Jul 10th, 2014
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <conio.h>
  5.  
  6. #define TAM 10
  7.  
  8. int vet[TAM];
  9.  
  10. typedef struct elemento { //Estrutura da lista duplamente encadeada
  11. int valor;
  12. int refer;
  13. struct elemento *prox;
  14. struct elemento *ant;
  15. }Elem;
  16.  
  17.  
  18.  
  19. Elem* cria() // Funcao criar alocação/ inicializa a lista
  20. {
  21. Elem *e;
  22. e=(Elem*)malloc(sizeof(Elem)); // Espaço é alocado do tamanho de Elem
  23. e->ant = NULL;
  24. e->prox = NULL;
  25. e->refer = 0;
  26. return e;
  27. }
  28.  
  29. void inserir(Elem *lista, int valor, int refer) //Função para inserção de um novo nó com seus devidos parâmetros na lista
  30. {
  31. Elem *e, *aux;
  32. e=(Elem*)malloc(sizeof(Elem));
  33. e->valor = valor;
  34. e->refer = refer;
  35. if(lista->prox == NULL) // Se a lista não existir, o primeiro elemento criado assumirá as seguintes características:
  36. {
  37. e->prox = NULL;
  38. e->ant = NULL;
  39. lista->prox = e;
  40. }
  41. else // Caso a lista exista, ocorrerá a definição dos parâmetros do novo nó dessa foma:
  42. {
  43. aux= lista->prox;
  44. for(;aux->prox!=NULL; aux=aux->prox); // Condição executada para poder chegar no último nó da lista.
  45. e->ant= aux;
  46. aux->prox = e;
  47. e->prox= NULL;
  48.  
  49. }
  50. }
  51.  
  52. void impressao(Elem *lista) //Função para impressão da lista duplamente encadeada
  53. {
  54. Elem *p;
  55. p=lista->prox;
  56. printf(" Lista \t Posicao\n");
  57. for(; p!=NULL ; p = p->prox)
  58. printf("\n %d \t %d ", p->valor, p->refer);
  59. }
  60.  
  61. void impressaoReverse(Elem *lista) //Função para imprimir a lista de trás pra frente
  62. {
  63. printf("\n\n");
  64. Elem *p;
  65. p=lista->prox;
  66. for(; p->prox!=NULL ; p = p->prox); // Acha o último nó da lista
  67.  
  68. for(; p!= NULL ; p = p->ant) // Imprime a partir do último nó em direção ao início
  69. {
  70. printf("\n %d", p->valor);
  71. }
  72.  
  73. }
  74.  
  75. void BubbleSort(Elem *lista) //Método de ordenação Bubble Sort
  76. {
  77. Elem *p;
  78. int j;
  79. for(j=0;j<TAM;j++)
  80. {
  81. p=lista->prox;
  82. for(; p->prox != NULL;p= p->prox)
  83. {
  84. if((p->valor) > (p->prox->valor))
  85. {
  86. int a;
  87. a = p->valor;
  88. p->valor = p->prox->valor;
  89. p->prox->valor = a;
  90. }
  91. }
  92. }
  93. }
  94.  
  95. void InsertionSort(Elem *lista) //Método de ordenação Insertion Sort - Em vetor
  96. {
  97. Elem *p, *pn , *pb; // Declaração de ponteiros
  98. int a_val, a_val2; // Parametros para o armazenamento dos valores dos respetivos nós
  99.  
  100. p=lista->prox;
  101. for(; p != NULL ; p=p->prox) // Looping com condiçao de parada quando o elemento da lista for nulo
  102. {
  103. pn = p; // PN armazena o valor de p no inicio da iteraçao
  104.  
  105. if(pn->ant != NULL) // Só começarão a ocorrer as trocas se P nao for o primeiro e unico elemento da lista
  106. {
  107. pb = p->ant; // "pb" recebe o endereço do nó anterior a "p".
  108. if(pb->valor > pn->valor) // Se o valor do nó anterior a "p" for maior do que o de "p"
  109. {
  110. do // Acontecerá a permutação dos valores
  111. {
  112. a_val = pn->valor; // a_val recebe o valor do nó de "p"
  113. a_val2 = pb->valor; // a_val2 recebe o valor do nó anterior a "p"
  114. pn->valor = a_val2; // o valor de "pn" é atualizado para o valor maior que estava contido em "pb"
  115. pb->valor = a_val; // o valor de "pb" é atualizado para o valor menor que estava contido em "pn"
  116. if(pn->ant !=NULL) // Garante a execução do metodo varrendo a lista em direção ao inicio para a verificação dos valores
  117. pn = pb;
  118. if(pb->ant != NULL)
  119. pb = pb->ant;
  120.  
  121. }while((pb->valor) > (pn->valor));
  122.  
  123. }
  124. }
  125. }
  126. }
  127.  
  128. void SelectionSort(Elem *lista) //Método de ordenação Selection Sort
  129. {
  130. int menor=99999;
  131. Elem *p, *pos, *q;
  132.  
  133. q=lista->prox; // "q" recebe o endereço do primeiro elemento da lista
  134. for(;q!= NULL;q=q->prox) // Enquanto q for diferente de NULL, o vetor será percorrido até que chegue no fim ao encontrar NULL.
  135. {
  136.  
  137. for (p=q;p != NULL;p=p->prox) // Atribui-se o endereço de "q" a "p", as condições são as mesmas do looping acima
  138. {
  139. if (p->valor < menor) // Se o valor do nó atual da iteração for menor que o valor atribuído a menor,
  140. { // a variavel "menor" recebe esse valor
  141. menor = p->valor;
  142. pos = p; // o endereço do respectivo nó é armazenado na variável "pos"
  143. }
  144. }
  145. pos->valor = q->valor; // os valores são trocados, de modo que os menores valores fiquem localizados à partir do inicio da
  146. q->valor = menor; // lista em ordem crescente.
  147. pos = NULL; // as variaveis sao resetadas para a proxima iteração do método
  148. menor=99999;
  149. }
  150.  
  151. }
  152.  
  153.  
  154. void QuickSort(int v[], int inicio , int fim) //Método de ordenação Quick Sort que sera escolhido pelo aluno ESCOLHER (ENTRE SHELLSORT, MERGESORT, QUICKSORT) --->>> QuickSort
  155. {
  156. int i, j, pivo, aux;
  157. i= inicio;
  158. j= fim;
  159. pivo = v[(inicio + fim)/2];
  160. while (i <= j)
  161. {
  162. while ( v[i] < pivo)
  163. i= i+1;
  164. while ( v[j] > pivo)
  165. j= j-1;
  166. if( i <= j )
  167. {
  168. aux= v[i];//printf("\n\tchegaaaaaquiiiii");
  169. v[i]=v[j];
  170. v[j]= aux;
  171. i= i+1;
  172. j= j-1;
  173. }
  174. }
  175.  
  176. if( j > inicio)
  177. QuickSort(v, inicio, j);
  178. if( i < fim )
  179. QuickSort(v, i, fim);
  180.  
  181. //////
  182.  
  183. int k;
  184.  
  185. for(k=0;k<TAM;k++)
  186. vet[k] = v[k];
  187. }
  188.  
  189.  
  190.  
  191.  
  192. int main() {
  193.  
  194. int i, valor, refer;
  195.  
  196. Elem *lista;
  197.  
  198. char op;
  199.  
  200. lista=cria(); // lista recebe o endereço do espaço alocado pela função cria()
  201.  
  202. do {
  203. //system("cls");
  204. printf("\n\nEscolha uma opcao\n\n\n");
  205. printf("1 - Gerar e Inserir na lista Duplamente Encadeada \n");
  206. printf("2 - Metodo Bolha\n");
  207. printf("3 - Metodo Selecao\n");
  208. printf("4 - Metodo Insercao\n");
  209. printf("5 - Metodo QuickSort\n");
  210. printf("6 - Sair\n\n\n");
  211. printf("Opcao: ");
  212. op = getchar();
  213. fflush(stdin);
  214. switch (op) {
  215.  
  216. case '1' : printf("\nSorteando e inserindo numeros...\n\n");
  217. srand(time(NULL)); //Inicializa o randomize
  218. if(lista->prox != NULL) // Caso a lista já exista, será apagada e outra vai ser criada.
  219. {
  220. Elem *e, *aux;
  221. e=lista->prox;
  222. for(;e!= NULL;)
  223. {
  224. aux=e;
  225. e= e->prox;
  226. free(aux);
  227. }
  228.  
  229. }
  230.  
  231. for(i = 0; i < TAM; i++) // Looping usado para atribuir cada valor à lista/vetor.
  232. {
  233. refer = i + 1;
  234. valor = (rand()%800)+1;
  235. inserir(lista,valor,refer);
  236. vet[i]= valor;
  237. }
  238.  
  239. impressao(lista); //Função para impressão da lista após ser gerada.
  240.  
  241. getch();
  242. break;
  243.  
  244. case '2' : printf("\nOrdencao Metodo BubbleSort \n\n");
  245.  
  246. BubbleSort(lista); //Chama metodo de ordenação BOLHA
  247. impressao(lista);
  248. getch();
  249. break;
  250.  
  251. case '3' : printf("\nOrdenacao Metodo SelectionSort \n\n");
  252. SelectionSort(lista); //Chama metodo de ordenação Seleção
  253. impressao(lista);
  254. getch();
  255. break;
  256.  
  257. case '4' : printf("\nOrdenacao Metodo InsertionSort\n\n");
  258.  
  259. InsertionSort(lista); //Chama metodo de ordenação Inserção no vetor
  260. impressao(lista);
  261. getch();
  262. break;
  263.  
  264. case '5' : printf("\nOrdenacao Metodo QuickSort\n\n");
  265.  
  266. QuickSort(vet, 0, TAM-1); //Chama metodo de ordenação QuickSort no vetor
  267.  
  268. int k;
  269. for(k=0;k<TAM;k++)
  270. printf("\n %d", vet[k]);
  271.  
  272. getch();
  273. break;
  274.  
  275. case '6' : break;
  276.  
  277. default : printf("\nOpcao invalida!\n\n");
  278. getch();
  279. }
  280. } while (op != '6');
  281.  
  282. return 0;
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement