【问题标题】:C Pointers, Linked Lists and NodesC 指针、链表和节点
【发布时间】:2018-05-08 17:49:31
【问题描述】:

我已经在这段代码上工作了几天,这就是我想出的地方(我之前在这里问过)。代码点是打印给定字符串上每个字母的出现次数,仅更改letters() 和report()。

我在letters() 中添加了printf,看看发生了什么。我不太确定在函数letters() 中是否需要第一个循环,但它正在打印整个输入的字符串。另外,如果我不把第一个循环放在letters() 中,那么report() 中的电流是NULL(为什么???)。 letters() 中的第二个循环只打印输入字符串的最后一个字母(为什么?)。而report() 再次只打印字符串的最后一个字母,current->occurences 打印一个随机的 6 位数字(可能是内存地址?),还报告永远持续,这意味着当前永远不会变成 NULL??? .我已经为此工作了好几天,我不明白为什么letters() 和report() 上的第二个循环不起作用,它们对我来说似乎是正确的。任何帮助表示赞赏...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct charact {
    char ch;
    int occurs;
    struct charact *next;
};

typedef struct charact Char;
typedef Char * ListofChar;
typedef Char * CharNode_ptr;
void letters(char name[50], ListofChar * chars_ptr);
void report(ListofChar chars);
Char * createnode(char ch);


int main() {
    char name[50];
    ListofChar chars = NULL;
    scanf("%s", name);
    letters(name,&chars);
    report(chars);
    return 0;
}


Char * createnode(char ch) {
    CharNode_ptr newnode_ptr ;
    newnode_ptr = malloc(sizeof (Char));
    newnode_ptr -> ch = ch;
    newnode_ptr -> occurs = 0;
    newnode_ptr -> next = NULL;
    return newnode_ptr;
}


void letters(char name[50],ListofChar* lst_ptr){
    ListofChar newnode ;
    newnode =(Char*)malloc(sizeof(Char));
    if(!newnode){printf("adinamia mnimis");}
    int i,j;

    for( i = 0 ; i < strlen(name)  ; i++){
        newnode->ch  = name[i] ;
        printf("Look: %c\n",newnode->ch);
        newnode->next = *lst_ptr ;
        *lst_ptr = newnode ;
        }

    for( i = 0 ; i < 50 ; i++){
        for( j = 0 ; j < strlen(name) ; j++){
            if  (newnode->ch == name[i]){
                newnode->occurs++;
                printf("uhm : %c\n",newnode->ch) ;
                newnode = newnode->next;
                break;
                }
            printf("hey : %c\n",newnode->ch);
        }
    }

}




void report(ListofChar chars) {
    ListofChar current  ;
    current = chars ;
    printf("the occurences of each letter are:\n");
    while(current != NULL){
        printf("%c :  %d\n", current->ch,current->occurs );
        current = current->next ;
    }
    if(current==NULL)printf("fail");
    return;
}

【问题讨论】:

  • SO 是一个糟糕的调试器!在编码时,您将学到的最重要的技能是如何调试自己的代码。 ericlippert.com/2014/03/05/how-to-debug-small-programs 如果你需要帮助,你需要整理你的解释,因为这段文字几乎无法阅读。告诉我们您想做什么、尝试过什么以及获得了什么结果。
  • 快速说明 - 避免在指针上使用 typedef,只会让你的生活变得悲惨
  • 您的老师需要学习如何编写清晰、可维护的 C 代码。请建议您的老师将问题代码提交给codereview.stackexchange.com。
  • 当(且仅当)您遇到从未遇到过的信件时,您需要致电createnode()。它需要在name 中每个字符的循环内,而不是在它之前。

标签: c pointers struct linked-list nodes


【解决方案1】:

另外,如果我不将第一个循环放在 letters() 中,那么在 report() 中当前为 NULL(为什么???)。

  • 它是 NULL,因为您不使用它做任何事情。您将其初始化为 NULL,然后将其传递给一个函数,没有对它做任何事情,当它到达 report() 时,它仍然是 NULL。

letters() 中的第二个循环只打印输入字符串的最后一个字母(为什么?)。

  • 它只打印最后一个字母,因为在letters() 的第一个循环中,您唯一要做的就是将newnode-&gt;ch 分配给当前字母,当循环退出时,它将具有最后一个字母的值。

report() 再次只打印字符串的最后一个字母,而 current->occurrences 打印一个随机的 6 位数字(可能是内存地址?

  • report() 打印一个随机数,因为你不知道是什么 newnode-&gt;occurs 值,然后在 letters() 中递增。

还报告永远持续下去,这意味着 current 永远不会变为 NULL ???

  • 它永远存在,因为 current 总是指向自身(letters() 中第一个循环中的逻辑已损坏。

这段代码有太多错误。我建议您坐下来阅读更多有关 C 指针基础知识的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2020-03-02
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多