编程珠玑 15 章

/* 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;
}














资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值