static void humminbird_read_route(gbfile* fin) { humminbird_rte_t hrte; if (! gbfread(&hrte, 1, sizeof(hrte), fin)) fatal(MYNAME ": Unexpected end of file!\n"); hrte.time = be_read32(&hrte.time); hrte.num = be_read16(&hrte.num); if (hrte.count > 0) { int i; route_head *rte = NULL; for (i = 0; i < hrte.count; i++) { waypoint *wpt; char buff[10]; hrte.points[i] = be_read16(&hrte.points[i]); /* locate the point over his internal Humminbird "Number" */ snprintf(buff, sizeof(buff), "%d", hrte.points[i]); if (avltree_find(waypoints, buff, (void *) &wpt)) { if (rte == NULL) { rte = route_head_alloc(); route_add_head(rte); rte->rte_name = xstrndup(hrte.name, sizeof(hrte.name)); /* rte->rte_num = hrte.num + 1; only internal number */ } route_add_wpt(rte, waypt_dupe(wpt)); } } } }
static int mmo_write_obj_mark(const char *sobj, const char *name) { char *key; gbuint16 nr; char buf[16]; int res; if (avltree_find(mmobjects, sobj, (void *)&key)) { nr = (unsigned)atoi(key); gbfputuint16(nr, fout); } else { mmo_object_id++; snprintf(buf, sizeof(buf), "%u", mmo_object_id); DBG(("write", "object \"%s\" registered (id = 0x%04X)\n", mmo_object_id)); avltree_insert(mmobjects, sobj, xstrdup(buf)); gbfputuint32(mmo_filemark, fout); gbfputuint16(strlen(sobj), fout); gbfwrite(sobj, strlen(sobj), 1, fout); } mmo_object_id++; res = mmo_object_id; mmo_writestr(name); return res; }
static void osm_disp_feature(const waypoint *wpt) { osm_icon_mapping_t *map; if (avltree_find(icons, wpt->icon_descr, (void *) &map)) osm_write_tag(osm_features[map->key], map->value); }
static mmo_data_t * mmo_get_object(const gbuint16 objid) { char key[16]; mmo_data_t *data; snprintf(key, sizeof(key), "%d", objid | 0x8000); if (! avltree_find(objects, key, (void *)&data)) fatal(MYNAME ": Unregistered object id 0x%04X!\n", objid | 0x8000); return data; }
static char osm_feature_ikey(const char *key) { int result; const void *p; if (avltree_find(keys, key, &p)) result = gb_ptr2int(p); else result = -1; return result; }
static void mmo_write_category(const char *sobj, const char *name) { char *key; gbuint16 nr; if (avltree_find(category_names, name, (void *)&key)) { nr = (unsigned)atoi(key); gbfputuint16(nr & 0x7FFF, fout); } else { mmo_write_obj_mark(sobj, name); mmo_register_category_names(name); } }
static char * osm_feature_symbol(const int ikey, const char *value) { char *result; char buff[128]; osm_icon_mapping_t *data; buff[0] = ikey; strncpy(&buff[1], value, sizeof(buff) - 1); if (avltree_find(values, buff, (void *)&data)) result = xstrdup(data->icon); else xasprintf(&result, "%s:%s", osm_features[ikey], value); return result; }
static void osm_rtept_disp(const waypoint *wpt_ref) { char *buff; waypoint *wpt; if (skip_rte) return; xasprintf(&buff, "%s\01%f\01%f", (wpt_ref->shortname) ? wpt_ref->shortname : "", wpt_ref->latitude, wpt_ref->longitude); if (avltree_find(waypoints, buff, (void *) &wpt)) { int *id = wpt->extra_data; gbfprintf(fout, " <nd ref='%d'/>\n", *id); } xfree(buff); }
static void osm_way_nd(const char *args, const char **attrv) { const char **avp = &attrv[0]; while (*avp) { if (strcmp(avp[0], "ref") == 0) { waypoint *tmp; if (avltree_find(waypoints, avp[1], (void *)&tmp)) { tmp = waypt_dupe(tmp); route_add_wpt(rte, tmp); } else warning(MYNAME ": Way reference id \"%s\" wasn't listed under nodes!\n", avp[1]); } avp += 2; } }
void avltree_insert(struct avltree *tree, struct node *n) { struct node **p; int cmp; //寻找插入位置 clear(tree); p = avltree_find(tree,n); //插入结点 n->left = NULL; n->right = NULL; n->height = 0; if(*p != NULL) { tree->set(*p,n); return; } *p = n; //调整 avltree_adjust(tree); }
int main() { struct avltree *tree; struct kvnode head; struct kvnode *tail; struct kvnode *p; char buf[200]; int retval; char *str; struct node **ins; FILE *f = fopen("bible.txt","r"); int start,end; tail = &head; tree = avltree_create(cmpf, setf); start = clock(); while((retval = fscanf(f,"%s",buf)) != EOF) { str = malloc(strlen(buf)+1); strcpy(str,buf); p = node_create(str,1); ins = avltree_find(tree,p); if(*ins == NULL) { //第一次 *ins = p; avltree_adjust(tree); tail->next = p; tail = p; } else { //直接插,不用平衡调整了 ((struct kvnode*)(*ins))->val ++; } } end = clock(); printf("%d\n",end-start); /* for(p=head.next; p!=tail; p=p->next) { printf("%s,%d\n",p->key,p->val); }*/ return 0; }
static void humminbird_write_waypoint_wrapper(const waypoint *wpt) { char *key; waypoint *tmpwpt; xasprintf(&key, "%s\01%.9f\01%.9f", wpt->shortname, wpt->latitude, wpt->longitude); if (! avltree_find(waypoints, key, (void *)&tmpwpt)) { tmpwpt = (waypoint *)wpt; avltree_insert(waypoints, key, wpt); tmpwpt->extra_data = gb_int2ptr(waypoint_num + 1); /* NOT NULL */ humminbird_write_waypoint(wpt); } else { void *p = tmpwpt->extra_data; tmpwpt = (waypoint *)wpt; tmpwpt->extra_data = p; } xfree(key); }
static void mmo_read_CObjWaypoint(mmo_data_t *data) { #ifdef MMO_DBG const char *sobj = "CObjWaypoint"; #endif waypoint *wpt; time_t time; int rtelinks; mmo_data_t **rtelink = NULL; char *str; char buf[16]; int i, ux; DBG((sobj, ":-----------------------------------------------------\n")); DBG((sobj, "name = \"%s\" [ visible=%s, id=0x%04X ]\n", data->name, data->visible ? "yes" : "NO", data->objid)); wpt = waypt_new(); wpt->shortname = xstrdup(data->name); time = data->mtime; if (! time) time = data->ctime; if (time > 0) wpt->creation_time = time; wpt->latitude = gbfgetdbl(fin); wpt->longitude = gbfgetdbl(fin); DBG((sobj, "coordinates = %f / %f\n", wpt->latitude, wpt->longitude)); rtelinks = gbfgetuint16(fin); if (rtelinks > 0) { rtelink = xcalloc(sizeof(*rtelink), rtelinks); DBG((sobj, "rtelinks = %d\n", rtelinks)); for (i = 0; i < rtelinks; i++) { mmo_data_t *tmp; int objid; DBG((sobj, "read rtelink number %d\n", i + 1)); objid = gbfgetuint16(fin); gbfseek(fin, -2, SEEK_CUR); rtelink[i] = tmp = mmo_read_object(wpt); if ((objid < 0x8000) && (tmp != NULL) && (tmp->type == rtedata)) { route_head *rte = tmp->data; tmp->left--; route_add_wpt(rte, waypt_dupe(wpt)); DBG((sobj, "\"%s\" Added to route \"%s\"\n", wpt->shortname, rte->rte_name)); } } } str = mmo_readstr(); /* descr + url */ if (strncmp(str, "_FILE_ ", 7) == 0) { char *cx, *cend; cx = lrtrim(str + 7); cend = strchr(cx, '\n'); if (cend == NULL) cend = cx + strlen(cx); cx = lrtrim(xstrndup(cx, cend - cx)); if (*cx) wpt->url = cx; else xfree(cx); if (*cend++) wpt->notes = xstrdup(cend); if (wpt->url) DBG((sobj, "url = \"%s\"\n", wpt->url)); } else if (*str) wpt->notes = xstrdup(str); xfree(str); if (wpt->notes) DBG((sobj, "notes = \"%s\"\n", wpt->notes)); mmo_fillbuf(buf, 12, 1); i = le_read32(&buf[8]); /* icon */ if (i != -1) { char key[16]; char *name; snprintf(key, sizeof(key), "%d", i); if (avltree_find(icons, key, (void *)&name)) { wpt->icon_descr = xstrdup(name); wpt->wpt_flags.icon_descr_is_dynamic = 1; DBG((sobj, "icon = \"%s\"\n", wpt->icon_descr)); } } wpt->proximity = le_read_float(&buf[4]); if (wpt->proximity) { wpt->wpt_flags.proximity = 1; DBG((sobj, "proximity = %f\n", wpt->proximity)); } str = mmo_readstr(); /* name on gps ??? option ??? */ if (*str) { wpt->description = wpt->shortname; wpt->shortname = str; DBG((sobj, "name on gps = %s\n", str)); } else xfree(str); ux = gbfgetuint32(fin); DBG((sobj, "proximity type = %d\n", ux)); if (rtelinks) { int i; for (i = 0; i < rtelinks; i++) { int j; route_head *rte = rtelink[i]->data; for (j = 0; j < rtelinks; j++) { if ((i != j) && (rtelink[i] == rtelink[j])) { rtelink[i]->loop = 1; break; } } rtelink[i]->done++; if ((rtelink[i]->left == 0) && (rtelink[i]->done == rte->rte_waypt_ct)) { if (mmo_version <= 0x11) mmo_end_of_route(rtelink[i]); } } } if (rtelink) { xfree(rtelink); waypt_free(wpt); data->data = NULL; } else waypt_add(wpt); }