Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define MAX_BITS 32
  7. #define MAX_STR_SIZE 2048
  8.  
  9. struct storage {
  10. char key[MAX_BITS + 1];
  11. char* value;
  12. storage & operator =(const storage &rhs) {
  13. strcpy(key, rhs.key);
  14. value = rhs.value;
  15. return *this;
  16. }
  17. };
  18.  
  19. int HexToInt(char hex) //translate int to char
  20. {
  21. if (hex >= 'a' && hex <= 'f') {
  22. return hex - 'a' + 10;
  23. }
  24. else {
  25. return hex - '0';
  26. }
  27. }
  28.  
  29. char IntToHex(int i) //translate char to int
  30. {
  31. if (i >= 10 && i <= 15) {
  32. return 'a' + i - 10;
  33. }
  34. else {
  35. return '0' + i;
  36. }
  37. }
  38.  
  39. void RadixSort(storage *SortedStorage, int size)
  40. {
  41. storage *Temp = (storage *)malloc(size * sizeof(storage));
  42. for (int iter = 31; iter >= 0; iter--) {
  43. //CountSort(SortedStorage, size, i);
  44. int count[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
  45.  
  46. //storage Temp[size];
  47. for (int i = 0; i < size; i++) { //calculate number of hexes in count
  48. count[HexToInt(SortedStorage[i].key[iter])]++;
  49. }
  50. for (int i = 0; i < 15; i++) { //sum of elements in count
  51. count[i + 1] += count[i];
  52. }
  53. for (int i = size - 1; i >= 0; i--) { //sorting into another array
  54. Temp[count[HexToInt(SortedStorage[i].key[iter])] - 1] = SortedStorage[i];
  55. count[HexToInt(SortedStorage[i].key[iter])]--;
  56. }
  57. memcpy(SortedStorage, Temp, (size) * sizeof(storage));
  58.  
  59. }
  60. free(Temp);
  61. }
  62.  
  63. int main()
  64. {
  65.  
  66. storage *NewStorage;
  67. const int init_cap = 2;
  68. int max_size = init_cap; //memory cap
  69. NewStorage = (storage*)malloc(sizeof(storage) * init_cap);
  70. int fill = 0; //checker for amount of memory left
  71. char tmp = 0;
  72. int i = 0;
  73. do { //input
  74. i = 0;
  75. tmp = getchar();
  76. if (tmp == EOF || tmp == '\n') {
  77. break;
  78. }
  79. while (tmp != '\t') {
  80. NewStorage[fill].key[i] = tmp;
  81. i++;
  82. tmp = getchar();
  83. }
  84. NewStorage[fill].key[32] = '\0';
  85. i = 0;
  86. char buf[MAX_STR_SIZE + 1];
  87. scanf("%[^\n]s", buf);
  88. int new_str_size = strlen(buf) + 1;
  89. char * new_str = (char*)malloc(sizeof(char) * new_str_size);
  90. if (new_str == NULL) {
  91. printf("Ne ok\n");
  92. }
  93. new_str = strcpy(new_str, buf);
  94. (NewStorage + fill)->value = new_str;
  95. tmp = getchar();
  96. fill++;
  97. if (fill == max_size) {
  98. max_size *= 2;
  99. storage *Temp = (storage *)realloc(NewStorage, max_size * sizeof(storage));
  100. if (Temp == NULL)
  101. puts("NO");
  102. NewStorage = 0;
  103. NewStorage = Temp;
  104. }
  105. } while (tmp != EOF); /*(NewStorage + fill - 1)->key[0] != EOF && (NewStorage + fill)->value[i] != EOF*/
  106.  
  107. RadixSort(NewStorage, fill);
  108.  
  109. for (int i = 0; i < fill; i++) { //output
  110. for (int j = 0; j < 32; j++) {
  111. putchar((NewStorage + i)->key[j]);
  112. }
  113. putchar('\t');
  114. printf("%s", (NewStorage + i)->value);
  115. free((NewStorage + i)->value);
  116. putchar('\n');
  117. }
  118. free(NewStorage);
  119. return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement