本文共 5321 字,大约阅读时间需要 17 分钟。
#include#include #define MAX 32 //一个字符串链表,保存相同的prio的字符串 struct string_list { char *str; struct string_list *next; }; //一个字符串包装,携带了一个prio struct string_wrap { char *string; int prio; }; //最终决定字符串位置的二叉树 struct string_node { struct string_list *string; struct string_list *last; int prio; struct string_node *left; struct string_node *right; }; //声明要使用的函数 struct string_node *add_node(struct string_node *, struct string_wrap *str, int (*cmp)(struct string_wrap *, struct string_node *)); void print_result(struct string_node *); //比较函数,比较优先级 int normalcmp(struct string_wrap *n1, struct string_node *n2) { return n1->prio - n2->prio; } //getprio函数,根据规则返回优先级 int getprio(char *s, int thread) { static int prio = 1; if (!strcmp(s, "F")) return 0; if (!strcmp(s, "L")) return 100; if (!strcmp(s, "B")) return 50; if (!strcmp(s, "A")) return 51; //如果希望不想关的字符串按照输入顺序输出,则放开下面的注释 //如果只是return prio++,那么字符串将按照原始顺序输出 //return prio++; //返回自然顺序,和上面注释的意义一样 return thread; } int main(int argc, char **argv) { struct string_node *root; int thread = 0; char string[MAX]; char *str[40] = {"L","F","A","dsfsfsg","L","B","A", "ss", "A"}; root = NULL; int i = 0; while (str[i]) { int prio = getprio(str[i], ++thread); struct string_wrap sw = {str[i], prio}; root = add_node(root, &sw, normalcmp); i ++; } print_result(root); return 0; } //标准的二叉树插入 struct string_node *add_node(struct string_node *p, struct string_wrap *new, int (*cmp)(struct string_wrap *n1, struct string_node *n2)) { int cmp_ret; if (p == NULL) { p = (struct string_node *)malloc(sizeof(struct string_node)); p->string = (struct string_list*)malloc(sizeof(struct string_list)); p->string->str = (char *)calloc(1, strlen(new->string)); strcpy(p->string->str, new->string); p->last = p->string; p->prio = new->prio; p->left = p->right = NULL; } else if ((cmp_ret = cmp(new, p)) == 0) { struct string_list *next = (struct string_list*)calloc(1, sizeof(struct string_list)); next->str = (char *)calloc(1, strlen(new->string)); strcpy(next->str, new->string); p->last->next = next; } else if (cmp_ret < 0) { p->left = add_node(p->left, new, cmp); } else { p->right = add_node(p->right, new, cmp); } return p; } //输出结果,如果不使用printf,可以用一个容器来装结果字符串 void print_result(struct string_node *p) { if (p != NULL) { print_result(p->left); for (; p->string; p->string = p->string->next) { printf("%s\n", p->string->str); } print_result(p->right); } }
从工程学角度看,社会分工早就不需要自己做饭请客了,然而从生活的角度,家里还是要备一些厨具,最起码的意义是不一样的。程序员的感觉与此类似,虽然有那么多的库,那么多的框架可以使用,然而如果不是为了项目,仅仅是自己实现一个小想法的话,还是自己动手会好一些,当然那些库和框架也要会用,毕竟程序员的工作是为公司效力,而公司是完全站在软件工程的角度上考虑问题的。因此,不应该让大家总是使用库和既有的实现,在项目中这么做即可,平时自己做小玩意或者搞一点hack,还这么做,那就不太合适了。
听科班出身的人说过,大学老师教导,初学编程,一定要先学命令行,然后再IDE,只是我不是科班出身,也没有受过那样的教导,虽如此,我还是很赞同的,如果不懂原理而只是简单的库拼接,那么只是空中楼阁,这样的人可能会是一个好的程序员,却很难成为一个好的设计者,紧急排错也最好不要找他们。我的观点并不是让大家都必须自己动手,说这句话也没有任何骄傲的成分,我只是想说:知其然,知其所以然,勿不求甚解。不求甚解,浮光掠影,下策!
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1270891
转载地址:http://dfkja.baihongyu.com/