C указатели, связанные списки и узлы - PullRequest
0 голосов
/ 08 мая 2018

Я работал над этим кодом уже пару дней, и вот к чему я пришел (я спрашивал здесь раньше). Точка кода должна напечатать количество вхождений каждой буквы на данной строке, изменяя только letters() и report().

Я добавил printf в letters(), чтобы увидеть, что происходит. Я не совсем уверен, что в функциях letters() необходим первый цикл, но он печатает всю введенную строку. Кроме того, если я не поместил первый цикл в letters(), то в report() current будет 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;
}

1 Ответ

0 голосов
/ 08 мая 2018

Кроме того, если я не помещаю первый цикл в letters (), то в report () текущий равен NULL (почему ???).

  • это NULL, потому что вы ничего с этим не делаете. Вы инициализировали его в NULL, затем передали в функцию, ничего с ним не сделали, и когда он достиг report(), он все еще был NULL.

Второй цикл в letters () печатает только последнюю букву введенной строки (опять почему?).

  • он печатает только последнюю букву, потому что в первом цикле в letters() единственное, что вы делаете, это присваиваете newnode->ch текущей букве, и при выходе из цикла она будет иметь значение последней буквы.

И report () снова печатает только последнюю букву строки, а current-> экземпляры печатают случайное 6-значное число (вероятно, адрес mem?

  • report() печатает случайное число, потому что вы не знаете, что было newnode->occurs значение, прежде чем увеличивать его в letters().

также отчеты продолжаются вечно, что означает, что ток никогда не становится NULL ???

  • это продолжается вечно, потому что ток всегда указывает на себя (ваша логика в первом цикле в letters() нарушена.

В этом коде слишком много ошибок. Я предлагаю вам сидеть и читать больше об основах C - указателей.

...