Как передавать строки из массивов в указатели при использовании структур (в c) - PullRequest
0 голосов
/ 14 мая 2018

Смысл этого кода состоит в том, чтобы прочитать строку от пользователя (длиной менее 50 символов), а затем использовать функцию букв, чтобы поместить буквы строки в указатель таким образом, чтобы каждая буква проходила только один раз, а затем также подсчет появления каждой буквы. Наконец, с использованием функции отчета он должен вывести на экран все, что я только что объяснил. Например, пользователь вводит «Hello», программа выводит:

H : 1    
e : 1    
l : 2   
o : 1    

код:

#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) {
    int i;
    for(i=0; name[i]!='\0'; i++){
        //everything is done here
    }
    return;
}

void report(ListofChar chars) {
    int i;
    // this is only to output the results
    return;
}

Заранее спасибо

1 Ответ

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

Насколько я понимаю, вы хотите использовать один связанный список для соединения узлов вместе. В примере программы я добавил новые узлы в начале. указатель головы содержит адрес последнего добавленного узла.

#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, ListofChar * head_ptr);

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

Char * createnode(char ch,ListofChar * head_ptr ) {
  CharNode_ptr newnode_ptr;
  ListofChar  temp;
  temp = *head_ptr;
  while(temp) {
     if( temp->ch  == ch) {
     temp->occurs += 1;
     return;
     }
     temp= temp->next;
 }
 newnode_ptr = malloc(sizeof (Char));
 newnode_ptr -> ch = ch;
 newnode_ptr -> occurs = 1;
 newnode_ptr -> next = *head_ptr;
  *head_ptr = newnode_ptr;
  return newnode_ptr;
 }

void letters(char name[50], ListofChar * lst_ptr) {
  int i;
  for(i=0; name[i]!='\0'; i++){
     createnode(name[i],lst_ptr);
     //everything is done here
   }
 return;
  }

 void report(ListofChar chars) {
    int i;
    while(chars)
     {
   printf("%c %d \n",chars->ch,chars->occurs);
   chars = chars->next;
    }
   //printf("%c \n",chars->ch);
   // this is only to output the results
   return;
   }
...