Pertanyaan Algoritma Desain Manual, bab 3, kebingungan kode-kode daftar tertaut


Saya membaca Algorithm Design Manual dan di bab 3, potongan kode berikut muncul. Ini ada hubungannya dengan menghapus item dari daftar tertaut. Pertanyaannya tidak terkait dengan struktur data, tetapi hanya untuk satu baris kode di mana dua variabel dinyatakan kupikir. Saya telah menanggalkan bagian kode yang tidak relevan untuk keringkasan.

list *search_list(list *l, item_type x) {
  // This function just searches the list x
}

list *predecessor_list(list *l, item_type x) {
  // This function simply returns the predecessor of x or NULL
}

delete_list(list **l, item_type x) {
  list *p;     /* item pointer */
  list *pred;  /* predecessor pointer */

  list *search_list(), *predecessor_list(); // What are these declarations?

  p = search_list(*l,x);

  // Code to delete the node if found is here    
}

Pertanyaan saya ada di dalam delete_list function, khususnya, garis list *search_list(), *predecessor_list();. Apa yang terjadi di jalur itu? Saya menduga ini adalah pointer ke fungsi, tetapi pemahaman saya adalah Anda seharusnya menyatakan pointer fungsi dengan parameter yang sesuai. Juga, dengan anggapan saya benar, mengapa garis-garis itu diperlukan?


4
2018-03-19 06:21


asal


Jawaban:


Garis yang dimaksud,

list *search_list(), *predecessor_list();

menginformasikan compiler bahwa suatu identifier untuk sebuah function ada dan apa jenis kembalinya. Dalam konteks ini, jumlah dan jenis parameter tidak memerlukan fungsi.

Saya setuju itu agak aneh dan tidak sangat intuitif, namun, bahasa C mendukung banyak kekhasan seperti itu.

Tautan yang diberikan dalam komentar untuk pertanyaan Anda oleh Dabo masuk ke lebih detail: Mengapa deklarasi kosong bekerja untuk definisi dengan argumen int tetapi tidak untuk argumen mengambang?


3
2018-03-19 06:41



Itu adalah deklarasi fungsi, untuk menginformasikan itu search_list() dan predecessor_list() kembali list*. Jika Anda menggunakan fungsi sebelum Anda menyatakannya, secara implisit dinyatakan sebagai 'fungsi mengembalikan int'. Dalam fungsi kasus search_list() dan predecessor_list() didefinisikan sebelumnya delete_list Anda tidak akan membutuhkan deklarasi itu.

Cobalah untuk menempatkan fungsi-fungsi itu setelahnya delete_list dan menghapus deklarasi, Anda akan mendapatkannya conflicting types for search_list() sebagai kompiler Anda akan menganggap itu search_list() dan predecessor_list() harus kembali int


2
2018-03-19 06:43