gpt4 book ai didi

c - 将带有字符串节点标签的边列表映射到整数标签

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:37 24 4
gpt4 key购买 nike

我有一个边列表格式的巨大图表,其中字符串作为节点标签。我想知道将字符串映射到整数的“最佳”方法是什么。输入文件如下示例:

Mike Andrew
Mike Jane
John Jane

输出(即映射文件)应该是:

1 2
1 3
4 3

下面粘贴的是读取输入文件的 C 框架。有人可以建议我如何继续。

#include <stdio.h>

int LoadFile(const char * filename) {
FILE *fp = NULL;
char node1[10];
char node2[10];
int idx = 0;

fp = fopen(filename, "r");
if (fp == NULL) {
perror("Error");
}

while (fscanf(fp, "%s %s", &node1, &node2) == 2) {
idx++;
}

fclose(fp);

return idx;
}

int main(void) {
int n = LoadFile("./test.txt");
printf("Number of edges: %d\n", n);
return 0;
}

最佳答案

您需要简单地实现映射(将字符串映射到整数)

  • 定义一个结构体来存储字符串。

        typedef struct {
    unsigned int hashed;
    char **map;
    } hash;
  • 定义一个函数,如果该字符串不存在,则将其插入到 hashmap 中,并返回该字符串在 hashmap 中的索引。

    int insertInMap(hash *map, char *entry)

  • 将返回的索引存储到edge结构中。

    edges[i].first =insertInMap(&map,first_string);
    边[i].second =insertInMap(&map,second_string)

示例代码:

typedef struct {
unsigned int first;
unsigned int second;
} edge;

typedef struct {
unsigned int hashed;
char **map;
} hash;


int insertInMap(hash *map, char *entry)
{
int i =0;
for (i=0;i<map->hashed;i++)
{
if (strcmp(map->map[i],entry) == 0)
return i+1;
}
/* Warning no boundary check is added */
map->map[map->hashed++] = strdup(entry);
return map->hashed;
}


edge *LoadFile(const char * filename) {
FILE *fp = NULL;
char node1[10];
char node2[10];
int idx = 0;

edge *edges;
hash map;

int numEdges = 10;
edges = malloc( numEdges * sizeof(edge));

map.map = malloc(numEdges * sizeof(char*));
map.hashed = 0;

fp = fopen(filename, "r");
if (fp == NULL) {
perror("Error");
}

while (fscanf(fp, "%s %s", &node1, &node2) == 2) {
if (idx >= numEdges)
{
numEdges *=2;
edges = realloc(edges, numEdges * sizeof(edge));

map.map = realloc(map.map, numEdges * sizeof(char*));
}
edges[idx].first =insertInMap(&map,node1);
edges[idx].second =insertInMap(&map,node2);
idx++;
}

fclose(fp);

return edges;
}

稍后打印

关于c - 将带有字符串节点标签的边列表映射到整数标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56074081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com