【问题标题】:linklist function not adding another list and causing infinite loop链接列表函数不添加另一个列表并导致无限循环
【发布时间】:2021-06-15 06:30:55
【问题描述】:

我希望在将新节点添加到链接列表功能方面获得一些帮助,但我似乎无法让它链接以创建新列表。

void addNodeToList(tweet **tweetList, tweet *node)
{
    tweet *temp;
    temp = *tweetList;
    if (*tweetList == NULL)
    {
        *tweetList = node;
        return;
    } else
    {
        while (temp->next != NULL)
        {
            temp = temp->next;
        }
        temp->next = node;

    }

    return;
}

这是我对函数的调用:

     if(menuOption==1){     
         tweets=createTweet( tweetList);
         addNodeToList(&tweetList,tweets);
         }

创建推文功能是:

tweet* createTweet(tweet *tweetList)
{
    tweet *saveTweet = (tweet *)(malloc(sizeof(tweet)));
    int ascii[51];
    int i = 0;
    int sum = 0;
    printf("Enter a username:\n");
    scanf("%s", saveTweet->user);

    printf("Enter the user's tweet:\n");

    scanf(" %[^\n]", saveTweet->text);

    while (saveTweet->user[i] != '\0')
    {
        ascii[i] = saveTweet->user[i];
        i++;
    }
    for (int j = 0; j < i - 1; j++)
    {
        sum = sum + ascii[j];
    }
    sum = sum + strlen(saveTweet->user);
    saveTweet->id = sum;
    printf("Your generated user id is:%d\n", saveTweet->id);

    tweetList->next = saveTweet;
    return saveTweet;
}

【问题讨论】:

  • 请提供完整的代码minimal reproducible example
  • 对不起,希望它更新了
  • 似乎很难正确缩进代码:/
  • 能否在您的问题中包含整个addNodeToList 函数?并包括createTweet 函数和结构声明......
  • 这就是我到目前为止所拥有的整个 addtonode 功能

标签: c function linked-list


【解决方案1】:

我认为问题出在您的 createTweet 函数中,您将新列表放在 createTweet 函数中 tweetList 的末尾,但您也在 addNodeToList 中执行相同的操作,因此您最终会得到一个指向自身的列表像这样: 成员1->成员2->成员2->成员2->成员2... 这是您的 createTweet 函数的更好版本

tweet * createTweet( /*tweet * tweetList*/) {
    tweet * saveTweet = malloc(sizeof(tweet));
    int ascii[51];
    int i = 0; 
    int sum = 0;

    if (!saveTweet) // always check if malloc failed to avoid accessing wrong memory
        return (NULL);
    printf("Enter a username:\n");
    scanf("%s", saveTweet->user);
    printf("Enter the user's tweet:\n");
    scanf(" %s[^\n]", saveTweet->text);
    while (saveTweet->user[i] != '\0') {
        ascii[i] = saveTweet->user[i];
        i++;
    }
    for(int j = 0; j < i - 1; j++) {
        sum=sum+ascii[j];
    }
    sum=sum+strlen(saveTweet->user);
    saveTweet->id=sum;
    printf("Your generated user id is:%d\n",saveTweet->id);
    //tweetList->next=saveTweet; <-- don't insert the member into the list yet, your addNodeToList function already does it
    return (saveTweet);
}

addNodeToList 函数中的 return 语句也是无用的:第一个是无用的,因为有 else,第二个是因为它是一个 void 函数,你不需要指定 return,除非你想在结束前离开函数(你的函数不是这样)

【讨论】:

  • 这段代码好像漏掉了重要的saveTweet-&gt;next = NULL;声明
  • 这样使用`scanf`是很不安全的
  • 真的,我忘记了savetweet->next my bad
猜你喜欢
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2016-05-31
  • 2014-04-22
  • 2013-10-07
  • 1970-01-01
  • 2019-05-15
  • 2011-03-09
相关资源
最近更新 更多