- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 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 килобайт.
tirinox 25.12.2012 12:35 # +2
Хэшмап бы тут.
taburetka 25.12.2012 12:50 # +1
absolut 25.12.2012 13:03 # +1
taburetka 25.12.2012 13:07 # −1
roman-kashitsyn 25.12.2012 13:10 # +5
guest 25.12.2012 13:21 # +2
absolut 25.12.2012 13:34 # +1
tirinox 25.12.2012 13:45 # +7
bormand 25.12.2012 15:07 # +2
wvxvw 25.12.2012 16:01 # +2
roman-kashitsyn 25.12.2012 16:20 # +3
Yuuri 25.12.2012 19:07 # +2
TarasB 25.12.2012 15:29 # +1
absolut 25.12.2012 15:45 # +2
TarasB 25.12.2012 17:15 # +1
bormand 25.12.2012 17:27 # 0
bormand 25.12.2012 16:56 # +2
Нет, это матрица из массивов указателей.
А теперь без шуток - есть же typedef, с помощью которого можно превратить эти созвездия в нечто более-менее понятное (или, при должной сноровке, в нечто совершенно непонятное).
movaxbx 25.12.2012 20:44 # +2
Так?
ps http://www.youtube.com/watch?v=uqMo-B5LhcA
LispGovno 25.12.2012 22:51 # +1
LispGovno 25.12.2012 23:06 # +2
bormand 26.12.2012 09:03 # +3
LispGovno 26.12.2012 09:06 # 0
ошибится легко, нереально просадив производительность
TarasB 26.12.2012 09:27 # 0
bormand 26.12.2012 10:00 # 0
absolut 26.12.2012 10:15 # 0
LispGovno 26.12.2012 11:27 # 0
TarasB 26.12.2012 10:44 # 0
LispGovno 26.12.2012 11:25 # +1
LispGovno 26.12.2012 11:26 # 0
absolut 26.12.2012 10:30 # 0
absolut 26.12.2012 10:29 # +1
bormand 25.12.2012 15:14 # +2
Ну а что вы хотели от неупорядоченного односвязного списка...
P.S. Цикл в строках 42-52 доставляет, это просто гениальная замена if (!*n), которое, впрочем, тут и не нужно, т.к. проверено в строке 27.
taburetka 25.12.2012 18:00 # +1
wvxvw 25.12.2012 15:54 # +2
Dummy00001 25.12.2012 17:57 # +2
с другой стороны, я и в продакшн коде кучи std::list (и давеча еще и java.util.LinkedList) c аналогичными юз-кейсами видел.
говно говнистое, но уж больно обыденое.
LispGovno 25.12.2012 23:05 # 0
http://zvon.org/other/haskell/Outputprelude/lookup_f.html
В стандартную библиотеку хаскеля входит функции для поиска по ключу в односвязанном списке за O(n). То есть хаскелисты это даже поощряют.