/* str.c */
/* 编程珠玑 15 章 */
/* 统计文本中每个单词出现的频率 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
char *word;
unsigned int count;
struct node *next;
}node, *nodeptr;
#define NHASH 299
#define MULT 31
nodeptr bin[NHASH];
unsigned int hash(char *p)
{
unsigned int h = 0;
for (; *p; p++)
{
h = MULT * h + (*p);
}
return h % NHASH;
}
void incword(char *s)
{
int h;
nodeptr p;
h = hash(s);
for (p = bin[h]; p != NULL; p++)
{
if (0 == strcmp(p->word, s))
{
p->count++;
return;
}
}
p = (nodeptr)malloc(sizeof(node));
if (NULL == p)
{
printf("malloc failed!\n");
exit(0);
}
p->word = (char *)malloc(sizeof(s) + 1);
if (NULL == p->word)
{
free(p);
printf("malloc failed!\n");
exit(0);
}
strcpy(p->word, s);
p->count = 1;
p->next = bin[h];
bin[h] = p;
}
int main()
{
int i;
char buf[256], buf1[256];
nodeptr p;
FILE *input;
int j;
input = fopen("data.txt", "r");
if (NULL == input)
{
printf("fopne failed\n");
exit(0);
}
for (i = 0; i < NHASH; i++)
{
bin[i] = NULL;
}
printf("input string:\n");
//while (gets(buf) && (strcmp(buf, "end") != 0))
//while (scanf("%s", buf) && (strcmp(buf, "end") != 0))
while (fgets(buf, 256, input) != NULL)
{
j = 0;
for (i = 0; buf[i] != '\0'; i++)
{
if (buf[i] != ' ' && buf[i] != '\n')
{
j++;
continue;
}
if (j != 0)
{
strncpy(buf1, buf+i-j, j);
buf1[j] = '\0';
incword(buf1);
j = 0;
}
}
if (j != 0)
{
strncpy(buf1, buf+i-j, j);
buf1[j] = '\0';
incword(buf1);
}
}
printf("\n\nresult:\n");
for (i = 0; i < NHASH; i++)
{
for (p = bin[i]; p != NULL; p = p->next)
{
printf("%s:%d\n", p->word, p->count);
}
}
printf("\n");
fclose(input);
return 0;
}
//求两个字符串相同部分长度
int comlen(char *p, char *q)
{
int i = 0;
while (*p && (*p++ == *q++))
{
i++;
}
return i;
}
int max_sub_str(char *s, char *sub)
{
int i, j;
int len;
int maxi, maxj;
int maxlen, thislen;
maxi = 0;
maxj = 0;
maxlen = 0;
thislen = 0;
len = strlen(s);
printf("%d\n", len);
for (i = 0; i < len; i++)
{
for (j = i + 1; j < len; j++)
{
if ((thislen = comlen(s+i, s+j)) > maxlen)
{
maxlen = thislen;
maxi = i;
maxj = j;
}
}
}
sub = s + maxi;
return maxlen;
}
int main()
{
char str[] = "ni hao wo zai jsp ei wo zai zhe ni";
char sub[256];
int len;
len = max_sub_str(str, sub);
if (len != 0)
{
printf("len:%d\n", len);
}
return 0;
}
/* 后缀数组 */
#define MAXN 5000
char c[MAXN], *a[MAXN];
int input_data()
{
int n = 0;
char ch;
printf("input data:\n");
while ((ch = getchar()) != '\n')
{
a[n] = &c[n];
c[n++] = ch;
}
c[n] = '\0';
return n - 1;
}
void qsort1(char *array[], int n)
{
int i, j;
char *tmp;
for (i = 0; i < n - 1; i++)
{
tmp = array[i];
for (j = i+1; j < n; j++)
{
if (strcmp(array[i], array[j]) > 0)
{
array[i] = array[j];
}
}
array[j] = tmp;
}
}
void max_sub_str(char *array[], int n)
{
int i;
int len = 0;
int maxi = 0;
int maxlen = 0;
for (i = 0; i < n - 1; i++)
{
if ((len = comlen(array[i], array[i+1])) > maxlen)
{
maxlen = len;
maxi = i;
}
}
printf("\nmax sub str:%s\n", a[maxi]);
}
int main()
{
int n;
n = input_data();
qsort1(a, n);
max_sub_str(a, n);
return 0;
}
编程珠玑 15 章
最新推荐文章于 2024-11-30 21:41:55 发布