在C语言中将元素添加到链表的特定链表中

在C语言中将元素添加到链表的特定链表中,c,C,假设我们有以下结构: typedef struct link { char link[MAXLINK]; struct link *next; } LinkT; typedef struct node { char keyword[MAXKEY]; LinkT *links; struct node *next; } NodeT; 在main函数中,我添加了一些新的关键字和链接。打印整个列表时得到的输出是: Asteroid Link-45

假设我们有以下结构:

typedef struct link {
    char link[MAXLINK];
    struct link *next;
} LinkT;

typedef struct node {
    char keyword[MAXKEY];
    LinkT *links;
    struct node *next; 
} NodeT;
在main函数中,我添加了一些新的关键字和链接。打印整个列表时得到的输出是:

Asteroid
    Link-45
    Link-23
Earth
    Link-2
Moon
    Link-3
    Link-1
我想在地球上添加一个新的链接-4。因此,输出将如下所示:

Asteroid
    Link-45
    Link-23
Earth
    Link-2
    Link-4
Moon
    Link-3
    Link-1
我的想法是使用
findLink
函数遍历关键字列表,然后遍历关键字匹配项,遍历链接列表,如果没有找到链接,我会添加新的链接

然而,问题是当我运行下面的代码时,它永远不会完成,不会输出任何东西(冻结?),我必须强制退出它

如果我删除最后添加的关键字和链接,它将运行但不正确,并打印该链接不在列表中。类似的函数
findKeyword
也会执行相同的操作-打印列表中没有的关键字

如何修复代码,使其针对任何列表运行

代码:

编辑1

我正在从函数类型void返回一个节点,这可能是无法按预期工作的原因。
findLink
函数需要什么类型

编辑2

正如Sahin在回答中指出的那样,我更新了
findLink
函数,现在程序运行了,但在不正确的位置添加了一个元素。主代码更改:

int main() {
    ...
    addNewKeyword(&wordsList, "Moon");
    addNewLink(wordsList, "Link-1");
    addNewLink(wordsList, "Link-3");

    addNewKeyword(&wordsList, "Earth");
    addNewLink(wordsList, "Link-2");
    
    addNewKeyword(&wordsList, "Asteroid");
    addNewLink(wordsList, "Link-23");
    addNewLink(wordsList, "Link-45");

    if (findLink(wordsList, "Earth", "Link-4") == NULL) {
        printf("Link is not in list.\n");
        addNewLink(wordsList, "Link-4");
    } else {
        printf("Link is in list.\n");
    }
    ...
}
输出:

Link is not in list.
Asteroid
    Link-4
    Link-45
    Link-23
Earth
    Link-2
Moon
    Link-3
    Link-1
我猜你的错误就在这里,你需要得到currentLink的下一个,因为同一个节点的下一个总是相同的。您需要在执行这些更正后测试代码,然后我们可以再次查看结果

编辑: 针对编辑2:

NodeT *addNewKeyword(NodeT **list, char *keyword) {
    NodeT *new = malloc(sizeof(NodeT));
    assert(new != NULL);
    strcpy(new->keyword, keyword);
    new->next = *list;
    *list = new; //This row
    return 0;
}

在我放置注释的行中,更改参数内的值,列表变量中的值也会更改。由于您最后使用“Asteroid”调用addNeKeyword,因此新链接将添加到那里。因此,请详细说明。您真正想要什么?

以及您对所显示的代码有什么具体问题?请提供输入、预期结果和实际结果。最重要的是,请提供完整的代码,因为我已经编辑了这个问题。在addNewKeyword中,您取消了对第一个参数(list)的引用,但第一次调用时,list为NULL<代码>节点集*wordsList=NULL;addNewKeyword(&wordsList,“月亮”)@AndersK我怎样才能解决这个问题?@Sahin很抱歉,我做了一些更改。是的,我想在调用
findLink
时为指定的任何关键字添加一个新链接-在这种情况下,它将是Earth;如果它是Mars,那么它应该向Mars链接列表添加一个新链接。好的,现在它运行了,但是向不正确的关键字添加了一个新链接。我现在会给帖子添加新的编辑。
void *findLink (NodeT *list, char *keyword, char *link) {
    NodeT *current = list;
    while (current != NULL) {
        if (strcmp(current->keyword, keyword) == 0) {
            
            LinkT *currentLink = current->links;//An error is here, you always look for the same list.

            while (currentLink != NULL) {
                if (strcmp(currentLink->link, link) == 0) {
                    return currentLink;
                }
                currentLink = currentLink->next;//The other error is here
            }
            return NULL;
        }
        current = current->next;
    }
    return NULL;
}
NodeT *addNewKeyword(NodeT **list, char *keyword) {
    NodeT *new = malloc(sizeof(NodeT));
    assert(new != NULL);
    strcpy(new->keyword, keyword);
    new->next = *list;
    *list = new; //This row
    return 0;
}