Saya mencoba menerapkan fungsi insert dari daftar tertaut tunggal. Fungsi implement saya harus memasukkan simpul baru di posisi kepala daripada ekor. ketika saya mencoba mengkompilasi kode c++ ini saya mendapatkan kesalahan runtime.

Ini kode saya:

#include <iostream>

using namespace std ;

struct node {
int data ;
struct node * next ;
};

struct node *head = NULL;

// inserting newnode at head position rather than tail
void insert (struct node* root , int idata) {
    if (root == NULL){
        root->next = NULL;
        root->data = idata;
    }
    
    else {
        struct node * newnode = (struct node *) malloc (sizeof (struct node) ) ;
        newnode->data = idata ;
        newnode->next = root ;
        root = newnode ;

    }

}


int main () {
    insert (head, 20) ;

    return 0;
}

Tetapi saya tidak dapat memahami mengapa saya mendapatkan kesalahan kompilasi. Mohon bantuannya!!

-1
user14106566 16 Januari 2021, 08:25

3 jawaban

Jawaban Terbaik

Kesalahan yang disebabkan oleh baris di bawah ini;

struct node *head = NULL;

Pertama di c++, Anda tidak perlu struct untuk mendeklarasikan objek.

Kedua Anda dapat mendeklarasikan head di dalam main lingkup lokal untuk menghindari polusi global.

Ketiga, penyebab utama error Anda, Anda harus mengalokasikan memori untuk mengakses objek apa pun.

Jadi, ubah fungsi main dan insert Anda menjadi di bawah ini.

int main () 
{
    node* head = NULL;
    insert(&head, 20) ;
    insert(&head, 30 );

    delete head;
    return 0;
}

Dan dalam fungsi insert, gunakan penunjuk ganda untuk meneruskan address dari head, sehingga perubahan yang Anda buat di dalam fungsi memengaruhi head yang sebenarnya.

void insert (node** root , int idata) {
        if ( (*root) == NULL )
        {
            (*root) = new node;
            (*root)->data = idata;
            (*root)->next = NULL;
        }
        else
        {        
            struct node * newnode = (struct node *) malloc (sizeof (struct node) ) ;
            newnode->data = idata ;
            newnode->next = *root ;
            *root = newnode;
        }

}
0
pvc 16 Januari 2021, 07:22

Ubah yang berikut ini di blok if Anda dari fungsi masukkan>

if (root == NULL){
        root = new node;  //this must be added to allocate memory for root node.
        root->next = NULL;
        root->data = idata;
    }
0
chaitanya 16 Januari 2021, 06:53

Saya tidak dapat menemukan kesalahan kompiler. Tapi ada beberapa kesalahan logika

void insert (struct node* root , // the root node is passed by reference
                                 // the pointer is not. So when you change where
                                 // root points, the caller won't know
             int idata) {
    if (root == NULL){
        root->next = NULL; // root points at NULL, a special parking location that, 
                           // on every target I've coded for, sits in a reserved memory
                           // area that will kill a program that reads from or writes 
                           // to it. Technically this would be  undefined behaviour, 
                           // but the results are extremely reliable to help you find 
                           // bugs.
        root->data = idata;
    }
    
    else {
        struct node * newnode = (struct node *) malloc (sizeof (struct node) ) ;
                       // malloc is almost always the wrong choice in C++
                       // use new. malloc requires you to be certain you 
                       // got the size right and does not call constructors. 
                       // It gives you memory, not objects.
        newnode->data = idata ;
        newnode->next = root ;
        root = newnode ;

    }

}

Sekarang jika Anda selalu ingin menyisipkan di root, tidak perlu if. Hanya ada satu tempat untuk node untuk pergi.

void insert (struct node*& root , //reference to pointer
             int idata) {
    root = new node {idata, root}; // this is aggregate initialization
}

Atau

node * insert (struct node* root , 
             int idata) {
    return new node {idata, root};
}

Yang pertama, penunjuk node yang disediakan oleh pemanggil sebagai root diperbarui dengan node baru yang pada gilirannya menunjuk ke root node lama. Di detik, node baru dialokasikan dan diarahkan ke root dan dikembalikan ke pemanggil. Penelepon menggunakan versi ini seperti

head = insert(head, 20); 

Dokumentasi untuk inisialisasi agregat

Dokumentasi untuk Perilaku Tidak Terdefinisi

0
user4581301 16 Januari 2021, 06:06