1. Си / Говнокод #12351

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAXSIZE 512
    
    typedef struct word
    {
    	char wordBody[MAXSIZE];
    	int count;
    	struct word* next;
    } Word;
    
    Word* alloc(char* incomeWord)
    {
    	Word* ret;
    	ret = (Word*)malloc(sizeof(Word));
    	ret->count=1;
    	ret->next=NULL;
    	strcpy(ret->wordBody, incomeWord);
    }
    
    void insert(Word **n, char* incomeWord)
    {
    	Word** p_p_n;
    	int h=0;
    
    	if(*n==NULL)
    	{
    		*n = alloc(incomeWord);
    		return;
    	}
    
    	for(p_p_n = n; *p_p_n!=NULL; p_p_n = &(*p_p_n)->next)
    	{
    		if((strcmp(incomeWord,&(*p_p_n)->wordBody))==0)
    		{
    			(*p_p_n)->count++;
    			return;
    		}
    	}
    
    	for(p_p_n = n; *p_p_n!=NULL; p_p_n = &(*p_p_n)->next)
    	{
    		Word* ins = alloc(incomeWord);
    		Word* temp = *p_p_n;
    		Word** tt;
    		int is=0;
    		tt=p_p_n;
    		ins->next=temp;
    		*p_p_n = ins;
    		break;
    	}
    }
    
    void print(Word* n)
    {
    	while(n!=NULL) {
    		if(n->count > 1)
    		{
    			printf("%s %d\n", n->wordBody, n->count);
    		}
    		n=n->next;
    	}
    }
    
    int main(void)
    {
    	char buf[MAXSIZE]={'\0'};
    	FILE *fr;
    	Word* sez=NULL;
    	fr=fopen("Text1.txt", "r");
    
    	while(!feof(fr))
    	{
    		fscanf(fr,"%s",buf);
    		insert(&sez,buf);
    	}
    
    	print(sez);
    	printf("\n%d\n", sizeof(sez));
    	fclose(fr);
    	return 0;
    }

    Считаем сколЬко раз каждое слово встречается в текстовом файле. Программа выполняется 6.5 минут с файлом размером 850 килобайт.

    Запостил: taburetka, 25 Декабря 2012

    Комментарии (36) RSS

    • Тут линкедлист не ок... А инсерт ваще упоротый, почему бы не вставить слово в начало, если не нашли?...
      Хэшмап бы тут.
      Ответить
      • Слово вставляется в начало, обратите внимание на break в for цикле.
        Ответить
    • Когда вижу нечто типа "Word **n" это более чем со 100% вероятностью говно. Однажды даже трёхзвездочный код видел в рабочем проекте.
      Ответить
      • Это учебный проект
        Ответить
      • Word **n - это бывает двухмерным массивом, если что.
        Ответить
        • а Word ***n - трехмерным. Но это не повод оперировать такими сущностями в явном виде, несмотря на то, что это сишечка.
          Ответить
          • Лучше, конечно, 5 звездочек!
            Ответить
            • Где-то у меня валялся код, в котором я just for lulz запилил разряженный массив в виде восьмизвездочной хреноты. Выглядел он примерно так:
              SomeStruct ********p = NULL;
              if (!p) {
                  p = malloc(sizeof(SomeStruct*******) * NODE_SIZE);
              }
              if (!p[i % NODE_SIZE]) {
                  p[i % NODE_SIZE] = malloc(sizeof(SomeStruct******) * NODE_SIZE);
              }
              if (!p[i % NODE_SIZE][i / NODE_SIZE % NODE_SIZE]) {
                  p[i % NODE_SIZE][i / NODE_SIZE % NODE_SIZE] = malloc(sizeof(SomeStruct*****) * NODE_SIZE);
              }
              ...
              Ответить
              • А когда начинал сгущаться, то выглядел так: SomeStruct**°°*°?
                Ответить
          • а word****n это массив матриц, передаваемый по ссылке
            Ответить
            • по указателю. в си сцылок нетути
              Ответить
              • да пох, семёнтика та же
                Ответить
                • Ну почти, ссылки иммутабельны. Так что наверное вот так: word **** const n;
                  Ответить
            • > это массив матриц, передаваемый по ссылке
              Нет, это матрица из массивов указателей.

              А теперь без шуток - есть же typedef, с помощью которого можно превратить эти созвездия в нечто более-менее понятное (или, при должной сноровке, в нечто совершенно непонятное).
              Ответить
              • typedef int ******** array_of_array_of_array_of_array_of_array_of_array_of_array_of_array_of_int;

                Так?

                ps http://www.youtube.com/watch?v=uqMo-B5LhcA
                Ответить
    • > Программа выполняется 6.5 минут с файлом размером 850 килобайт.
      Ну а что вы хотели от неупорядоченного односвязного списка...

      P.S. Цикл в строках 42-52 доставляет, это просто гениальная замена if (!*n), которое, впрочем, тут и не нужно, т.к. проверено в строке 27.
      Ответить
      • Именно этот цикл и был причиной публикации. Код написан анонимным студентом Карлового университета в Праге, факулЬтет информатики.
        Ответить
    • От того, что между буквами p, p и n появились подчерки, сразу все прояснилось в названии переменной.
      Ответить
    • школьные задания это скучно. по моему опыту там говнистость больше от преподов зависит, чем от самой школоты.

      с другой стороны, я и в продакшн коде кучи std::list (и давеча еще и java.util.LinkedList) c аналогичными юз-кейсами видел.

      говно говнистое, но уж больно обыденое.
      Ответить
      • > std::list (и давеча еще и java.util.LinkedList)
        http://zvon.org/other/haskell/Outputprelude/lookup_f.html
        В стандартную библиотеку хаскеля входит функции для поиска по ключу в односвязанном списке за O(n). То есть хаскелисты это даже поощряют.
        Ответить

    Добавить комментарий