Hai teman-teman, saya sedang belajar C dan ada beberapa masalah yang tidak dapat saya selesaikan.

Pertama-tama, ini adalah struktur data saya:

struct user_node {
 void *name;
 struct user_node *next;
 struct msg_node *msgnext;
};

struct msg_node {
 void *sender;
 void *receiver;
 void *title;
 void *content;
 struct msg_node *msgnext;
};
struct user_node *user_database = NULL;

Idenya adalah bahwa pengguna mungkin memiliki satu atau lebih pesan.

Yah saya dapat membuat dan menghapus pengguna tetapi saya mengalami masalah dalam menyimpan pesan, misalnya di sini:

Tujuan dari fungsi ini adalah untuk menempatkan temp sebagai pesan di dalam struktur data saya untuk pengguna tertentu yang kami temukan dalam pesan itu sendiri. (temp sudah msg_node dengan data yang saya ambil dari fungsi lain)

void sendMsg(struct msg_node* temp) {
//if list is empty
if (user_database == NULL) {
    printf("There aren't users on the system.\n\n");
    return;
}

struct user_node** ptr = &user_database;
while (*ptr) {
    if (strncmp((*ptr)->name, (temp)->receiver, strlen(temp-
>receiver)) == 0) {


        temp->msgnext = &user_database->msgnext;
        user_database->msgnext = temp;

        return;
    }
    ptr = &(*ptr)->next;
}
printf("User not found on the system\n\n");

return;
}

Saya tahu bahwa kodenya salah tetapi saya telah mengacaukan ini sejak kemarin dan saya tidak dapat memahaminya, dapatkah seseorang membantu saya?

Terima kasih sebelumnya

0
Edw4rd 21 Oktober 2017, 18:28
Dari struct Anda, saya mengerti bahwa pengguna memiliki daftar pesan. Apakah itu benar?
 – 
gsamaras
21 Oktober 2017, 18:36
Anda tidak memerlukan penunjuk ke penunjuk simpul pengguna di sini; hanya penunjuk simpul (user_node *) sudah cukup. Saat Anda menyisipkan pesan, gunakan iterator Anda ptr, bukan global user_database: tmp->msgnext = ptr->msgnext; ptr->msgnext = tmp; (Tidak jelas mengapa Anda menggunakan ampersand; Anda mungkin ingin melakukan sesuatu dengan (*ptr)->msgnext.)
 – 
M Oehm
21 Oktober 2017, 18:37
Ya, itu benar.
 – 
Edw4rd
21 Oktober 2017, 19:08
Bisakah Anda mengkodekannya?
 – 
Edw4rd
21 Oktober 2017, 19:10
Saya telah menulis jawaban dengan kode (belum diuji, maaf!).
 – 
M Oehm
21 Oktober 2017, 19:38

1 menjawab

Jawaban Terbaik

Anda dapat menyisipkan simpul di depan daftar tertaut dengan mengatur penunjuk berikutnya dari simpul baru ke kepala daftar dan kemudian mengatur kepala lis ke simpul baru. Ini berfungsi bahkan untuk daftar kosong, ketika kepala daftar adalah NULL.

Anda hampir benar, tetapi kepala Daftar adalah yang terkait dengan pengguna saat ini, bukan dengan kepala daftar pengguna, yaitu pengguna pertama dalam database.

Kode berikut harus melakukan apa yang Anda inginkan:

int sendMsg(struct msg_node *msg)
{
    struct user_node *user = user_database;

    if (user == NULL) {
        printf("There aren't users on the system.\n");
        return -1;
    }

    while (user) {
        if (strcmp(ptr->name, msg->receiver) == 0) {
            msg->msgnext = user->msgnext;
            user->msgnext = msg;

            return 0;
        }

        user = user->next;
    }

    printf("User '%s' not found on the system.\n", msg->receiver);

    return -1;
}

Catatan:

  • Saya telah mengganti nama pointer dari temp dan ptr yang agak tidak mencolok menjadi msg dan user yang lebih deskriptif.
  • Saya telah membuat fungsi mengembalikan kode sukses: 0 untuk sukses dan 1 untuk kegagalan.
  • strncmp hanya akan membandingkan sejumlah karakter tertentu. Saya telah mengubah ini menjadi strcmp, sehingga pengguna Paul dan Pauline dianggap berbeda.
  • Tidak perlu membuat penunjuk traversing sebagai penunjuk ke penunjuk ke simpul. Teknik itu berguna, tetapi hanya ketika Anda ingin menyisipkan atau menghapus node. Memasukkan di bagian depan adalah kasus khusus di mana Anda tidak akan membutuhkannya. (Dan Anda menyisipkan pesan, bukan pengguna, jadi jika Anda ingin menyisipkan pesan di tempat lain selain di depan, Anda bisa beralih melalui sub-daftar dengan pointer ke pointer ke node pesan.)
1
M Oehm 21 Oktober 2017, 21:14
Ini memberi saya masalah kompilasi: while (*user) { if (strcmp(ptr->name, msg->receiver) == 0) { msg->msgnext = usr->msgnext; usr->msgnext = pesan; Mungkin kompiler saya?
 – 
Edw4rd
21 Oktober 2017, 19:45
Bagus bahwa Anda telah menemukan kesalahan. (Maaf, itu berasal dari memposting kode yang belum diuji. Tapi saya tidak bisa mengumpulkan antusiasme untuk menulis kerangka pengujian di sekitarnya.)
 – 
M Oehm
21 Oktober 2017, 21:15