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

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

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

你能给我些帮助吗?

最佳答案

如注释中所述,您正在访问未初始化的指针,这是 undefined 的行为。该代码应该可以工作,但是您有内存泄漏。我没有检查您可能遇到的其他潜在问题。

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

关于c++ - 链接节点列表,分段FAULT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56509664/

10-14 09:11
查看更多