Pertanyaan struktur data generik dalam C [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Apakah ada cara untuk membuat struktur data generik dalam C dan menggunakan fungsi sesuai dengan tipe data yang tersimpan, struktur yang memiliki berbagai jenis data dan misalnya dapat dicetak sesuai dengan data yang tersimpan.

Sebagai contoh,

Misalkan saya ingin membuat pohon pencarian biner yang baru saja mengapung, int disimpan. Pendekatan alami yang harus dilakukan adalah membuat enumerasi dengan int dan float's. itu akan terlihat seperti ini:

Typedef enum {INT, FLOAT} DataType;

Typedef struct node
{
    void *data;
    DataType t;
    struct node *left,
                *right;
}Node;

jika saya ingin mencetaknya:

void printTree(Node *n)
{
    if (n != NULL)
    {
        if (n->t == INT)
        {
            int *a = (int *) n->data;
            printf("%d ", *a);
        }
        else
        {
            float *a = (float *) n->data;
            printf("%f ", *a);
        }

        printTree(n->left);
        printTree(n->right);
    }
}

Tidak apa-apa tetapi saya ingin menyimpan tipe data lain sebagai tumpukan, kueri atau hal lain. Jadi itulah mengapa saya membuat pohon yang tidak bergantung pada tipe data tertentu, seperti:

Typedef struct node
{
    void *data;
    struct node *left,
                *right;
}Node;

Jika saya ingin mencetaknya saya menggunakan fungsi callback, seperti:

Node *printTree(Node *n, void (*print)(const void *))
{
    if (n != NULL)
    {
        print(n->data);
        printTree(a->left);
        printTree(a->right);
    }
}

Tapi itu jatuh ketika saya mencoba memasukkan bilangan bulat dan pelampung dan mencetaknya. Pertanyaan saya adalah, Apakah ada cara untuk membuat struktur data generik yang rutin tergantung pada tipe data tertentu dalam satu situasi tetapi situasi lain yang tidak, untuk tipe data campuran? Dalam situasi ini saya harus membuat struktur yang menyimpan toko-toko int dan float itu dan menggunakan fungsi cetak seperti dalam kode cetak pertama untuk itu dalam fungsi callback?

observasi: Saya baru saja mendeklarasikan node dalam struktur dan melakukan semua hal yang berusaha disederhanakan, tetapi idenya adalah menggunakan struktur dengan .h dan .c dan semua abstraksi ini yang melibatkan struktur data.


4
2017-12-11 23:22


asal


Jawaban:


C tidak mendukung jenis tipe / struktur data generik seperti ini. Anda memiliki beberapa opsi yang bisa Anda pilih:

  • Jika Anda memiliki kesempatan untuk menggunakannya Dentang sebagai compiler, ada ekstensi bahasa untuk fungsi overload dalam C. Tetapi Anda harus melemparkan argumen ke tipe tertentu, sehingga compiler mengetahui fungsi mana yang harus dihubungi.

  • Gunakan C ++

    • meskipun Anda masih harus melemparkan argumen, sehingga kompilator tahu yang mana dari fungsi-fungsi yang tersedia yang disebut print dia harus menelepon.

    • menggunakan template

  • Buat fungsi yang disebut print yang mengambil sesuatu seperti

    struct data_info {
      void *data;
      enum_describing_type type;
    }
    

    print melakukan switch dan memanggil yang sesuai printInt, printFloat dll.


1
2017-12-11 23:33



Saya sarankan mencoba sesuatu seperti berikut ini. Anda akan memperhatikan itu Node mengandung a serikat bertanda yang memungkinkan untuk jenis pointer, integer, atau nomor floating point. Kapan Node adalah tipe pointer, kebiasaan print fungsi dipanggil, dan dalam kasus lain, yang sesuai printf format digunakan.

typedef enum {POINTER, INT, FLOAT} DataType;

typedef struct node
{
    DataType t;
    union {
        void *pointer;
        int integer;
        float floating;
    } data;
    struct node *left,
                *right;
} Node;

void printTree(Node *n, void (*print)(const void *))
{
    if (n != NULL) {
        switch (n->t) {
            case POINTER:
                print(n->data.pointer);
                break;
            case INT:
                printf("%d ", n->data.integer);
                break;
            case FLOAT:
                printf("%f ", n->data.floating);
                break;
        }
        printTree(a->left, print);
        printTree(a->right, print);
    }
}

4
2017-12-11 23:31



uthash adalah kumpulan file header yang menyediakan tabel hash yang diketik, daftar yang ditautkan, implementasi dll, semua menggunakan makro C preprocessor.


0
2017-12-11 23:32