我要创建一个链接节点列表。这个想法是用字母将单词分开,然后用每个字母创建一个链接节点列表。 另外,我尝试将最后一个节点添加到最后一个位置。
我已经尝试了很多方法,从理论上讲,它是可行的,但是我找不到分段错误的起源。
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;}
能给我一些帮助吗?
答案 0 :(得分:0)
如注释中所述,您正在访问未初始化的指针,这是未定义的行为。该代码应该可以,但是您有内存泄漏。我没有检查您可能遇到的其他潜在问题。
#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]);
}
}