查找树,俄罗斯方块,系统编程开始
This commit is contained in:
35
Chapter11/ds/tree/retrieval/Makefile
Normal file
35
Chapter11/ds/tree/retrieval/Makefile
Normal file
@@ -0,0 +1,35 @@
|
||||
# 方便起见一般都会先定义编译器链接器
|
||||
CC = gcc
|
||||
LD = gcc
|
||||
|
||||
# 正则表达式表示目录下所有.c文件,相当于:SRCS = main.c a.c b.c
|
||||
SRCS = $(wildcard *.c)
|
||||
|
||||
# OBJS表示SRCS中把列表中的.c全部替换为.o,相当于:OBJS = main.o a.o b.o
|
||||
OBJS = $(patsubst %c, %o, $(SRCS))
|
||||
|
||||
# 可执行文件的名字
|
||||
TARGET = main
|
||||
|
||||
# .PHONE伪目标,具体含义百度一下一大堆介绍
|
||||
.PHONY:all clean
|
||||
|
||||
# 要生成的目标文件
|
||||
all: $(TARGET)
|
||||
|
||||
LDFLAGS=-L/usr/local/lib
|
||||
|
||||
# LDLIBS=-lqueue -lllist
|
||||
|
||||
# 第一行依赖关系:冒号后面为依赖的文件,相当于Hello: main.o a.o b.o
|
||||
# 第二行规则:$@表示目标文件,$^表示所有依赖文件,$<表示第一个依赖文件
|
||||
$(TARGET): $(OBJS)
|
||||
$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
|
||||
|
||||
# 上一句目标文件依赖一大堆.o文件,这句表示所有.o都由相应名字的.c文件自动生成
|
||||
%.o:%.c
|
||||
$(CC) -c $^
|
||||
|
||||
# make clean删除所有.o和目标文件
|
||||
clean:
|
||||
rm -f $(OBJS) $(TARGET)
|
||||
121
Chapter11/ds/tree/retrieval/trie.c
Normal file
121
Chapter11/ds/tree/retrieval/trie.c
Normal file
@@ -0,0 +1,121 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define DESC_SIZE 256
|
||||
#define KEY_SIZE 256
|
||||
#define BUFSIZE 512
|
||||
#define FNAME "log"
|
||||
|
||||
struct node_st
|
||||
{
|
||||
struct node_st *ch[26];
|
||||
char desc[DESC_SIZE];
|
||||
};
|
||||
|
||||
static int get_word(FILE *fp, char *key, char *desc)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
char *retp;
|
||||
int i, j;
|
||||
|
||||
retp = fgets(buf, BUFSIZE, fp);
|
||||
if (NULL == retp)
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < KEY_SIZE - 1 && buf[i] != ':'; i++)
|
||||
key[i] = buf[i];
|
||||
key[i] = '\0';
|
||||
|
||||
i++;
|
||||
|
||||
for (j = 0; j < DESC_SIZE - 1 && buf[i] != '\0'; j++, i++)
|
||||
desc[j] = buf[i];
|
||||
desc[j] = '\0';
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct node_st *newnode()
|
||||
{
|
||||
struct node_st *node;
|
||||
int i;
|
||||
|
||||
node = malloc(sizeof(*node));
|
||||
if (NULL == node)
|
||||
return NULL;
|
||||
|
||||
node->desc[0] = '\0';
|
||||
|
||||
for (i = 0; i < 26; i++)
|
||||
node->ch[i] = NULL;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
static int insert(struct node_st **root, char *key, char *desc)
|
||||
{
|
||||
if (NULL == *root)
|
||||
{
|
||||
*root = newnode();
|
||||
if (NULL == *root)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ('\0' == *key)
|
||||
{
|
||||
strcpy((*root)->desc, desc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return insert((*root)->ch + *key - 'a', key + 1, desc);
|
||||
}
|
||||
|
||||
static char *find(struct node_st *root, char *key)
|
||||
{
|
||||
if (NULL == root)
|
||||
return NULL;
|
||||
|
||||
if ('\0' == *key)
|
||||
return root->desc;
|
||||
|
||||
return find(root->ch[*key - 'a'], key + 1);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
struct node_st *tree;
|
||||
FILE *fp;
|
||||
char desc[DESC_SIZE] = {'\0'}, key[KEY_SIZE] = {'\0'};
|
||||
int ret;
|
||||
char *datap;
|
||||
|
||||
fp = fopen(FNAME, "r");
|
||||
if (NULL == fp)
|
||||
{
|
||||
fprintf(stderr, "fopen():error!\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
ret = get_word(fp, key, desc);
|
||||
if (-1 == ret)
|
||||
break;
|
||||
|
||||
// puts(key);
|
||||
// puts(desc);
|
||||
|
||||
insert(&tree, key, desc);
|
||||
}
|
||||
|
||||
datap = find(tree, "donkey");
|
||||
if (NULL == datap)
|
||||
printf("Can not find!\n");
|
||||
else
|
||||
puts(datap);
|
||||
|
||||
fclose(fp);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
Reference in New Issue
Block a user