链接节点列表,分段FAULT

时间:2019-06-08 19:52:11

标签: c++

我要创建一个链接节点列表。这个想法是用字母将单词分开,然后用每个字母创建一个链接节点列表。 另外,我尝试将最后一个节点添加到最后一个位置。

我已经尝试了很多方法,从理论上讲,它是可行的,但是我找不到分段错误的起源。

    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;}

能给我一些帮助吗?

1 个答案:

答案 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]);
    }
}