ホーム>source

リンクリストを実装しようとしています。このサンプルプログラムでは、ユーザーは整数値(リストに保存する文字列の数)を入力し、文字列を1つずつ入力します...しかし、いくつかの入力(4または5の場合もあります)後にプログラムがクラッシュしますここの画像のように...

さらに、malloc()を含む関数を一度に3回以上呼び出すことはできません。 問題が発生している理由がわかりません。問題の解決にご協力ください。...

#include <bits/stdc++.h>
using namespace std;
typedef struct Linked_List NODE;
struct Linked_List
{
    string data;
    NODE* next;
};
//Function prototypes
NODE *traverse(NODE *temp);
NODE* createNode(string data);
void preAppend(NODE* ln_list, string x);
NODE* find_data(NODE* ln_list, string data);
int main()
{
    NODE* x=createNode("");
    int t;
    cin >>t;
    string z;
    while(t--)
    {
        cin >> z;
        preAppend(x, z);
    }
    traverse(x);
    return 0;
}
NODE *traverse(NODE *temp)
{
    cout << temp->data << endl;
    if(temp->next==NULL) return temp;
    traverse(temp->next);
}
NODE* createNode(string data)
{
    NODE* node = (NODE*)malloc(sizeof(NODE));
    if(node==NULL)
    {
        printf("Error creating node (Error! Allocating Memory)\n");
        exit(1);
    }
    node->data = data;
    node->next = NULL;
}
void preAppend(NODE* ln_list, string x)
{
    NODE* new_node = (NODE*)malloc(sizeof(NODE));
    if(new_node==NULL)
    {
        printf("Error! Appending (Error Allocating Memory)\n");
        exit(1);
    }
    new_node->data = x;
    new_node->next = ln_list->next;
    ln_list->next = new_node;
}
NODE* find_data(NODE* ln_list, string data)
{
    NODE* current_node;
    current_node = ln_list;
    while(current_node->next!=NULL)
    {
        if(current_node->data == data)
        {
            return current_node;
        }
        current_node  = current_node -> next ;
    }
    return NULL;
}

あなたの答え
  • 解決した方法 # 1

    コードにはいくつかの問題があります。

    malloc の使用   new の代わりに

    malloc を使用する  c ++オブジェクトを含むオブジェクト( string など) あなたの場合)コンストラクタを呼び出さないため、構築されていないオブジェクトに対する操作は失敗します。

    return なしでプログラムが機能する場合  文、未定義の動作のためです

    解決:

    交換

    NODE* new_node = (NODE*)malloc(sizeof(NODE));
    
    

    NODE* new_node = new NODE;
    
    

    return なし  非void関数のステートメント

    NODE *traverse(NODE *temp)
    {
      cout << temp->data << endl;
      if (temp->next == NULL) return temp;
      return traverse(temp->next);  // return statement is needed here
    }
    NODE* createNode(string data)
    {
      NODE* node = new NODE;
      if (node == NULL)
      {
        printf("Error creating node (Error! Allocating Memory)\n");
        exit(1);
      }
      node->data = data;
      node->next = NULL;
      return node;    // return statement needed here
    }
    
    

    再帰の乱用

    traverse で再帰を使用する  長いリストではスタックオーバーフローが発生する可能性があります。

    反復アプローチを使用する必要があります。しかし、あなたはすでにそれを知っています。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ google apps script - 一意の名前が付けられた複数のCSV添付ファイルをGMAILからGOOGLESHEETSにインポートする方法