最近写了一个C程序统计计算web log中的ip每个IP出现的次数,于是采用数据结构中的二叉树进行实现,具体代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/time.h> struct tnode { char *word; int count; struct tnode *left; struct tnode *right; }; /* 记录时间 */ static double mytime(void) { struct timeval tv; if(gettimeofday(&tv, NULL) == -1) return 0.0; return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; } /* 构建二叉树 */ static struct tnode *addtree(struct tnode *p, char *w) { int cond; /* 判断是否为空 如果为空树,构建根节点 */ if (p == NULL) { p = (struct tnode *) malloc(sizeof(struct tnode)); if (p == NULL) { fprintf(stderr, "Cannot alloc memory!"); exit(-1); } p->word = strdup(w); p->count = 1; p->left = p->right = NULL; } else if ((cond = strcmp(w, p->word)) == 0) /* 是否存在叶子节点中*/ p->count++; /* 如果存在叶子节点计数加一 */ else if (cond < 0) p->left = addtree(p->left, w); /* 如果不存在叶子节点且比叶子节点少,则添加左叶子节点 */ else p->right = addtree(p->right, w); /* 如果存在叶子节点且比叶子节点大,则添加右叶子节点 */ return p; } /* 打印二叉树 */ static void print(struct tnode *p) { if (p != NULL) { print(p->left); fprintf(stdout, "%s:t%dn", p->word, p->count); print(p->right); } } int main(int argc, char *argv[]) { FILE *fp; char ip[32] = {}, buf[512] = {}; int i; struct tnode *root = NULL; /* 打开log文件 */ fp = fopen("access.log", "rb"); if (fp == NULL) { fprintf(stderr, "Cannot open file login.log"); exit(-1); } /* 记录当前的时间 */ double stime = mytime(); /* 按行读取文件 */ while (fgets(buf, sizeof(buf), fp)) { /* 遇到空格跳出 */ for (i = 0; i < 16 && buf[i] != '