Я бы создал список связанных узлов. Идея состоит в том, чтобы разделить слово по буквам и создать список связанных узлов по каждой отдельной букве. Также я пытаюсь добавить последний узел в последнюю позицию.
Я пробовал много вещей, теоретически это работает, но я не нахожу, откуда берется ошибка сегментации.
struct nodo{
int frecuencia;
nodo *next;
char letra;
};
int main(){
string recibir; cin>>recibir; // recibir is the input.
nodo *n;
for(size_t i=0;i< recibir.size();i++){
agregarnodoalista(n,recibir[i]);}
Добавить узел в список Функция: (Если существует узел с такой же буквой, добавьте +1 к частоте).
void agregarnodoalista(nodo *&n, char caracter){
if (buscarletra(n,caracter)) localizarnodo(n,caracter)->frecuencia++;
else{
nodo *nodito;
nodito= new nodo;
nodo *ptr;
while(ptr->next!=NULL){
ptr=ptr->next;
}
ptr->next = nodito;
nodito->letra=caracter;
}}
Найдите букву в списке и говорит, есть она или нет. функция:
bool buscarletra(nodo *n, char letrita){
nodo *ptr;
for(ptr=n; ptr!=NULL;ptr=ptr->next){
if (ptr->letra==letrita) return true;}
return false;}
Возвращает узел указателя, если он содержит букву.
nodo *localizarnodo(nodo *n, char letrita){
nodo *ptr;
for(ptr=n; ptr!=NULL; ptr=ptr->next){
if (ptr->letra==letrita) return ptr;
}
return NULL;}
Не могли бы вы помочь мне?
На самом деле вызов buscarletra уже демонстрирует поведение undefined, потому что n не инициализирован.
@IgorTandetnik спасибо, я отвлекусь. позже я отвечу вам!!
Проблема заключалась в неправильной инициализации "n", чтобы решить (nodo *n ; n=NULL;) . Спасибо вам всем!!





Как упоминалось в комментариях, вы получаете доступ к неинициализированным указателям, что является неопределенным поведением. Этот код должен работать, но у вас утечки памяти. Я не проверял другие потенциальные проблемы, которые могут у вас возникнуть.
#include <iostream>
#include <string>
using namespace std;
struct nodo {
int frecuencia;
nodo *next;
char letra;
};
bool buscarletra(nodo* n, char letrita) {
nodo *ptr = n;
for (; ptr != NULL; ptr = ptr->next) {
if (ptr->letra == letrita)
return true;
}
return false;
}
nodo *localizarnodo(nodo *n, char letrita) {
nodo *ptr;
for (ptr = n; ptr != NULL; ptr = ptr->next) {
if (ptr->letra == letrita) return ptr;
}
return NULL;
}
void agregarnodoalista(nodo *n, char caracter) {
if (buscarletra(n, caracter)) localizarnodo(n, caracter)->frecuencia++;
else {
nodo *nodito;
nodito = new nodo;
nodo *ptr = new nodo;
while (ptr->next != NULL) {
ptr = ptr->next;
}
ptr->next = nodito;
nodito->letra = caracter;
}
}
int main() {
string recibir;
cin >> recibir; // recibir is the input.
nodo* n = new nodo;
for (size_t i = 0; i < recibir.size() - 1; i++) {
n->letra = recibir[i];
nodo* next = new nodo;
n->next = next;
n = n->next;
}
n->letra = recibir[recibir.size() - 1];
n->next = NULL;
for (size_t i = 0; i < recibir.size(); i++) {
agregarnodoalista(n, recibir[i]);
}
}
Спасибо, точно, проблема была в том, что переменная "n" не была инициализирована. Это решено. Спасибо вам всем!!
@jpflow не проблема. Вы можете принять ответ, если он решен. Не забывайте, что у вас есть утечки памяти.
nodo *ptr; while(ptr->next!=NULL){демонстрирует неопределенное поведение путем доступа к неинициализированной переменнойptr