informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tipe data yang telah kita lihat sebelumnya, seperti int, float, char, dll., hanya digunakan dalam program. Jika kita ingin membuat beberapa data kompleks sesuai dengan kebutuhan kita, kita perlu menggunakan struktur.
Misalnya, nomor siswa, nama, jenis kelamin, usia, dll. milik siswa yang sama, tetapi variabel-variabel ini memiliki tipe yang berbeda. Jika Anda hanya menggunakan variabel yang berbeda untuk membuat definisi sederhana, sulit untuk mencerminkan hubungan di antara mereka . Kemudian kita membuat sebuah variabel yang dapat menggabungkan data-data tersebut dan memasukkannya ke dalam variabel tersebut, sehingga lebih mudah digunakan.
- 结构体类型:
- struct Student
- {
- int num;//学号为整形;
- char name[20];//姓名为字符串;
- char sex;//性别为字符型;
- int age;//年龄为整形
- float score;//成绩为浮点型
- char addr[30];//地址为字符型;
- }
di dalam:
struct Student adalah tipe struktur;
struct adalah kata kunci yang mendeklarasikan tipe struktur.
Siswa adalah nama strukturnya, untuk membedakannya dengan struktur lainnya;
Kurung kurawal berisi anggota struktur. Grup tersebut bersama-sama disebut daftar anggota, dan penamaannya konsisten dengan penamaan variabel;
Catatan: Tipe struktur dapat memiliki beberapa tipe; seperti: struct Student; struct Teacher;
Anggota suatu struktur juga dapat berupa tipe struktur lain;
struktur Tanggal
{
int bulan;
int hari;
int tahun;
};
struktur Siswa
{
int nomor;
nama char[20];
jenis kelamin char;
int usia;
struct Tanggal ulang tahun;
char alamat[30];
}
Sebelumnya kita hanya mendefinisikan tipe struktur, yang setara dengan model, dan tidak mendefinisikan variabel. Selanjutnya kita mendefinisikan variabel struktur dan menyimpan data spesifik di dalamnya, 3 metode;
Metode 1: Deklarasikan tipe struktur terlebih dahulu, lalu tentukan variabel struktur
Berdasarkan tipe struktur sebelumnya struct Student, tentukan variabel struktur;
struct Siswa siswa1, siswa2;
Metode ini mirip dengan int a,b; satu-satunya prasyarat adalah sudah ada tipe struktur, dan variabel struktur ditentukan berdasarkan tipenya.
Metode 2: Tentukan variabel sambil mendeklarasikan tipenya
membentuk:
nama struktur struct
{
Daftar anggota;
}Daftar nama variabel;
Contoh:
struktur Siswa
{
int nomor;
nama char[20];
jenis kelamin char;
int usia;
skor mengapung;
char alamat[30];
}siswa1,siswa2;
Metode 3: Definisikan variabel tipe struktur secara langsung tanpa menentukan nama tipe
membentuk:
struktur
{
Variabel anggota;
}Daftar nama variabel;
Ini adalah tipe struktur yang tidak disebutkan namanya dan tidak umum digunakan;
Catatan: 1. Nama anggota pada variabel struktur boleh sama dengan nama variabel pada program;
2. Anggota variabel struktur dapat digunakan sendiri; status dan fungsinya setara dengan variabel biasa;
Inisialisasi variabel struktur saat mendefinisikannya;
Contoh:Masukkan informasi siswa (termasuk nomor siswa, nama, jenis kelamin, alamat) ke dalam variabel struktur, lalu keluarkan informasi siswa;
- #include <stdio.h>
-
- int main()
- {
- struct Student
- {
- int num;
- char name[20];
- char sex;
- char addr[20];
- }student1 = {101,"Li li",'M',"123XiAn"};
- printf("NO:%d,nname:%snssex:%cnaddress:%sn",student1.num,student1.name,student1.sex,student1.addr);
- return 0;
Analisis hasil:
Saat mendefinisikan variabel struktur, inisialisasi anggotanya. Daftar inisialisasi adalah sejumlah konstanta yang diapit kurung kurawal. Konstanta ini adalah anggota yang ditugaskan ke variabel struktur pada satu waktu struktur. Inisialisasi tipe tubuh.
Nilai anggota dalam variabel struktur, metode referensinya adalah:
Nama variabel struktur. Nama anggota
nama siswa1
Untuk anggota struktur yang termasuk dalam tipe struktur lain, anggota tingkat terendah harus ditemukan tingkat demi tingkat. Misalnya, struct Student yang disebutkan di atas berisi struct Tanggal ulang tahun;
Bulan ulang tahun siswa
Struktur dengan tipe yang sama dapat ditugaskan satu sama lain:siswa1 = siswa2;
Contoh:Masukkan ID siswa, nama dan nilai dua siswa, dan tampilkan ID siswa, nama dan nilai siswa dengan nilai lebih tinggi;
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
-
- int main()
- {
- struct Student
- {
- int num;
- char name[20];
- float score;
- }student1,student2;
- scanf("%d%s%f", &student1.num, student1.name, &student1.score);
- scanf("%d%s%f", &student2.num, student2.name, &student2.score);
- printf("The higher score is:n");
- if (student1.score > student2.score)
- {
- printf("%d %s %6.2fn", student1.num, student1.name, student1.score);
- }
- else if (student1.score < student2.score)
- {
- printf("%d %s %6.2fn", student2.num, student2.name, student2.score);
- }
- else
- {
- printf("%d %s %6.2fn", student1.num, student1.name, student1.score);
- printf("%d %s %6.2fn", student2.num, student2.name, student2.score);
- }
- }
Saat menggunakan fungsi scanf untuk memasukkan variabel struktur, Anda harus memasukkannya secara terpisah. Anda tidak dapat menggunakan nama variabel struktur dalam fungsi scanf untuk memasukkan nilai semua anggota sekaligus. Perhatikan bahwa fungsi scanf tidak memiliki & di depan dari nama siswa1, karena nama array aslinya mewakili Punya alamat.
Ketika kita mendefinisikan variabel struktur sebelumnya, kita mendefinisikannya satu per satu. Namun, jika itu adalah sekelompok data terkait yang perlu berpartisipasi dalam operasi, maka jelas perlu menggunakan data, seperti informasi 10 siswa adalah array struktur, setiap elemen array dari array struktur adalah sebuah struktur.
Misal: Ada tiga calon, dan setiap pemilih hanya dapat memilih satu orang, maka diperlukan program penghitungan suara. Pertama, masukkan nama calon, dan terakhir tampilkan hasil suara masing-masing.
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
-
- struct Person
- {
- char name[20];
- int count;
- }leader[3] = { "wang", 0, "zhang", 0, "li", 0 };
- int main()
- {
- int i, j;
- char lead_name[20];
- for (i = 0; i < 10; i++)
- {
- scanf("%s", lead_name);
- for (j = 0; j < 3; j++)
- {
- if (strcmp(lead_name, leader[j].name) == 0)
- leader[j].count++;
- }
- }
- printf("nResultn");
- for (i = 0; i < 3; i++)
- {
- printf("name:%s,count:%dn", leader[i].name, leader[i].count);
- }
- return 0;
- }
Tentukan bentuk umum dari array struktur:
nama struktur struct
{
daftar variabel
} nama array [panjang array];
atau
Pertama-tama deklarasikan tipe struktur, seperti: struct student, lalu tentukan array struktur;
Nama array tipe struktur [panjang array];
Bentuk inisialisasi struktur array adalah dengan menambahkan setelah definisi:
={Daftar nilai awal};
Contoh:Terdapat informasi tentang n siswa (termasuk ID siswa, nama, dan nilai), dan informasi setiap siswa harus dikeluarkan berdasarkan urutan nilai;
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
-
- struct Student
- {
- int num;
- char name[20];
- float score;
- };
-
- int main()
- {
- struct Student stu[5] = { 1001, "Wangwei", 98.25, 1002, "Liuliu", 91, 1003, "Zhangli", 98, 1004, "Xiaozhao", 85, 1005, "Baibai", 94 };
- struct Student temp;
- printf("The order id:n");
- int i, j,k;
- for (i = 0; i < 4; i++)
- {
- k = i;
- for (j = i + 1; j < 5; j++)
- {
- if (stu[j].score>stu[k].score)
- {
- k = j;
- }
- }
- temp = stu[k];
- stu[k] = stu[i];
- stu[i] = temp;
- }
- for (i = 0; i < 5; i++)
- {
- printf("%d %s %5.2f", stu[i].num, stu[i].name, stu[i].score);
- printf("n");
- }
- return 0;
- }
Yang disebut penunjuk struktur adalah penunjuk ke variabel struktur. Alamat awal variabel struktur adalah penunjuk variabel struktur.
Variabel penunjuk yang menunjuk ke objek struktur dapat menunjuk ke variabel struktur atau elemen array struktur. Tipe dasar variabel penunjuk harus sama dengan tipe variabel struktur.
Misalnya: struct Student * pt;
Contoh:Keluarkan informasi anggota dalam variabel struktur melalui variabel penunjuk yang menunjuk ke variabel struktur;
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
-
- struct Student
- {
- long num;
- char name[20];
- char sex;
- float score;
- };
-
- int main()
- {
- struct Student stu1;
- struct Student *pt;
- pt = &stu1;
- stu1.num = 10001;
- strcpy(stu1.name, "Lili");
- stu1.sex = 'M';
- stu1.score = 96.5;
- printf("No:%dnname:%snsex:%cnscore:%5.1fn", stu1.num, stu1.name, stu1.sex, stu1.score);
- printf("n");
- printf("No:%dnname:%snsex:%cnscore:%5.1fn", (*pt).num, (*pt).name, (*pt).sex, (*pt).score);
- printf("n");
- printf("No:%dnname:%snsex:%cnscore:%5.1fn", pt->num, pt->name, pt->sex, pt->score);
- return 0;
- }
Analisis hasil:
Dalam fungsinya, fungsi printf pertama mengakses anggota melalui nama variabel struktur stu1;
Fungsi printf kedua mengakses anggotanya melalui variabel penunjuk yang menunjuk ke variabel struktur. (*pt) mewakili variabel struktur yang ditunjuk, dan (*pt).num mewakili anggota struktur yang ditunjuk.
Selain itu, dalam bahasa C diperbolehkan mengganti (*pt).num dengan pt->num;
Variabel penunjuk dapat digunakan untuk menunjuk ke elemen array struktur.
Contoh:Ada tiga informasi siswa, ditempatkan dalam susunan struktur, dan informasi siswa harus dikeluarkan;
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
-
- struct Student
- {
- long num;
- char name[20];
- char sex;
- float score;
- };
-
- int main()
- {
- struct Student stu[3] = { 1001, "wangle", 'M', 95, 1002, "chengcai", 'M', 99.9, 1003, "shangmin", 'F', 85.2 };
- struct Student *pt;
- printf("No. name sex scoren");
- for (pt = stu; pt < stu + 3; pt++)
- {
- printf("%d %s %c %5.2fn", pt->num, pt->name, pt->sex, pt->score);
- }
- return 0;
- }
Dalam program ini, pt adalah penunjuk ke variabel struktur tipe struct Student. Ini digunakan untuk menunjuk ke variabel struktur, bukan ke anggota struktur tertentu variabel struktur dan yang lainnya adalah variabel anggota struktur. p++, nilai p menambah panjang struktur.
Ada tiga cara untuk meneruskan nilai variabel struktur ke suatu fungsi;
1. Gunakan anggota variabel struktur sebagai parameter. Metode ini setara dengan meneruskan variabel biasa. Perlu diperhatikan bahwa parameter formal dan aktual (anggota struktur) memiliki tipe yang sama;
2. Gunakan variabel struktur sebagai parameter sebenarnya. Ketika variabel struktur digunakan sebagai parameter aktual, ia juga diteruskan dengan nilai. Semua isi unit memori yang ditempati oleh variabel struktur diteruskan ke parameter formal.
3. Gunakan penunjuk ke variabel struktur (array) sebagai parameter aktual untuk meneruskan alamat variabel struktur (array) ke parameter formal.
Contoh:
Ada n struktur, termasuk ID siswa, nama, dan nilai dalam 3 mata kuliah. Diperlukan untuk menampilkan informasi siswa dengan nilai rata-rata tertinggi (termasuk ID siswa, nama, nilai dalam 3 mata kuliah, dan nilai rata-rata) .
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- void print(struct Student stud);
- struct Student Max(struct Student stu[]);
- void input(struct Student stu[]);
- struct Student
- {
- int num;
- char name[20];
- float score[3];
- float aver;
- };
-
- int main()
- {
- struct Student stu[3], *pt;
- pt = stu;
- input(pt);
- print(Max(pt));
- return 0;
- }
- void input(struct Student stu[])
- {
- int i;
- printf("请输入各学生的信息:学号、姓名、3门成绩:n");
- for (i = 0; i < 3;i++)
- {
- scanf("%d%s%f%f%f", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
- stu[i].aver = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0;
- }
- }
-
- struct Student Max(struct Student stu[])
- {
- int i, m = 0;
- for (i = 0; i < 3; i++)
- {
- if (stu[i].aver > stu[m].aver)
- m = i;
- }
- return stu[m];
- }
- void print(struct Student stud)
- {
- printf("成绩最好的学生是:n");
- printf("学号:%d 姓名:%s 三门课程:%5.2f %5.2f %5.2f平均成绩:%5.2fn", stud.num, stud.name, stud.score[0], stud.score[1], stud.score[2], stud.aver);
- }
1. Saat memanggil fungsi masukan, parameter aktualnya adalah variabel penunjuk pt, dan parameter formalnya adalah larik struktur. Yang diteruskan adalah alamat awal elemen struktur, dan fungsi tersebut tidak memiliki nilai kembalian;
2. Saat memanggil fungsi Max, parameter sebenarnya adalah variabel penunjuk pt, parameter formal adalah array struktur, alamat awal elemen struktur diteruskan, dan nilai kembalian fungsi adalah data tipe struktur.
3. Saat memanggil fungsi cetak, parameter sebenarnya adalah variabel struktur (elemen array struktur), dan parameter formal adalah variabel struktur, yang diteruskan adalah nilai setiap anggota dalam variabel struktur, dan fungsi tersebut tidak memiliki nilai kembalian.
Daftar tertaut adalah struktur data umum, yang merupakan struktur untuk alokasi penyimpanan dinamis.
Saat menyimpan data dalam sebuah array, panjang array (beberapa array) harus ditentukan terlebih dahulu. Jika beberapa kelas memiliki 100 siswa dan beberapa kelas memiliki 30 siswa, jika array yang sama digunakan untuk menyimpan data siswa di kelas yang berbeda, maka itu akan terjadi. harus didefinisikan. Sebuah array dengan panjang 100, tetapi hal ini sering menyebabkan pemborosan sumber daya. Daftar tertaut tidak memiliki kekurangan seperti itu. Ini membuka unit memori sesuai kebutuhan.
Daftar tertaut memiliki variabel "penunjuk kepala", diwakili oleh kepala pada gambar, yang menyimpan alamat, yang menunjuk ke suatu elemen. Setiap elemen dalam daftar tertaut disebut "simpul", dan setiap simpul harus mencakup dua bagian:
1. Data aktual yang dibutuhkan pengguna;
2. Alamat elemen selanjutnya;
Terlihat bahwa alamat setiap elemen pada linked list pada memori dapat bersifat diskontinu. Untuk mencari suatu elemen tertentu harus dicari terlebih dahulu elemen sebelumnya, dan elemen selanjutnya dapat dicari berdasarkan alamat elemen sebelumnya. . Jika "penunjuk kepala" tidak tersedia, seluruh daftar tertaut tidak dapat diakses.
Dalam hal ini, yang paling tepat adalah menggunakan struktur untuk membuat daftar tertaut. Struktur berisi beberapa anggota, dan anggota tipe penunjuk digunakan untuk menyimpan alamat node berikutnya.
struktur Siswa
{
int nomor;
int skor;
struct Siswa *berikutnya;
}
Diantaranya, num dan score digunakan untuk menyimpan data pengguna, dan next digunakan untuk menyimpan alamat node berikutnya.
Kasus:
Membuat daftar tertaut statis, terdiri dari node dengan data tiga siswa, dan mengharuskan data setiap node dikeluarkan;
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
-
- struct Student
- {
- int num;
- float score;
- struct Student * next;
- };
-
- int main()
- {
- struct Student a, b, c, *head, *p;
- a.num = 1001; a.score = 85.5;
- b.num = 1002; b.score = 95.5;
- c.num = 1003; c.score = 84.5;
- head = &a;
- a.next = &b;
- b.next = &c;
- c.next = NULL;
- p = head;
- do
- {
- printf("%d %5.2fn", p->num, p->score);
- p = p->next;
- } while (p != NULL);
- return 0;
- }
Misalnya, buat daftar tertaut sehingga head menunjuk ke node a, a.next menunjuk ke node b, b.next menunjuk ke node c, dan c.next menunjuk ke null. Ini membentuk hubungan daftar tertaut.
Saat mengeluarkan daftar tertaut, Anda harus menggunakan p terlebih dahulu, membuat p menunjuk ke a, lalu mengeluarkan data di a p=p->selanjutnya adalah menyiapkan node berikutnya untuk keluaran.
Sebelum berbicara tentang daftar tertaut dinamis, izinkan kami memperkenalkan terlebih dahulu kepada Anda alokasi memori dinamis.
Sebelumnya kami mengatakan bahwa variabel dibagi menjadi variabel global dan variabel lokal. Variabel global dialokasikan di area penyimpanan statis di memori.Variabel lokal yang tidak disimpan secara statis dialokasikan di area penyimpanan dinamis memori. Tempat penyimpanan ini disebuttumpukan。
Selain itu, bahasa C juga memungkinkan pembentukan area alokasi memori dinamis untuk menyimpan beberapa data sementara. Data ini dibuka saat dibutuhkan dan dilepaskan saat tidak diperlukan. Data ini disimpan sementara di tempat penyimpanan khusus yang bebastumpukan。
Alokasi memori dinamis dicapai melalui fungsi yang disediakan oleh sistem: fungsi malloc, calloc, free dan realloc.
1. Gunakan fungsi malloc untuk membuka tempat penyimpanan dinamis
fungsi: void *malloc (unsigned int ukuran);
Fungsi:
Alokasikan ruang kontinu dengan ukuran panjang (satuan: byte) di area penyimpanan dinamis memori.
nilai kembalian:
Alamat byte pertama yang dialokasikan; alamat ini tidak memiliki tipe, hanya alamat biasa;
2. Gunakan fungsi calloc untuk membuka tempat penyimpanan dinamis
fungsi:void * calloc(n tak bertanda,ukuran tak bertanda);
Fungsi:
Alokasikan n byte ruang kontinu dengan ukuran panjang di area penyimpanan dinamis memori. Ruang ini relatif cukup besar untuk menyimpan sebuah array;
Gunakan fungsi calloc untuk membuka ruang penyimpanan dinamis untuk array satu dimensi, n adalah jumlah elemen array, dan size adalah panjang elemen.
nilai kembalian:
Alamat byte pertama yang dialokasikan; alamat ini tidak memiliki tipe, hanya alamat biasa;
3. Gunakan fungsi realloc untuk mengalokasikan kembali area penyimpanan dinamis
fungsi:void * realloc(void *p ,unsigned int ukuran);
Fungsi:
Alokasikan kembali memori dinamis yang dialokasikan.
Gunakan fungsi recallloc untuk mengubah ukuran ruang dinamis yang ditunjukkan oleh p menjadi ukuran. Nilai p tetap tidak berubah;
nilai kembalian:
Alamat byte pertama memori dinamis setelah pembaruan pada dasarnya adalah alamat yang ditunjuk oleh p.
4. Gunakan fungsi gratis untuk melepaskan area penyimpanan dinamis
fungsi: void bebas(void *p);
Fungsi:
Lepaskan ruang dinamis yang ditunjuk oleh variabel penunjuk p sehingga bagian ruang tersebut dapat digunakan oleh variabel lain.
p adalah nilai kembalian yang diperoleh dari panggilan terakhir ke fungsi malloc dan calloc;
nilai kembalian:
tidak ada;
Catatan: Deklarasi keempat fungsi di atas semuanya ada di file header stdlib.h.
tipe penunjuk kosong:
Nilai yang dikembalikan dari fungsi malloc dan fungsi calloc di atas keduanya bertipe void *, artinya tidak menunjuk ke tipe data apa pun. Tidak dipahami sebagai menunjuk ke tipe apa pun, tetapi menunjuk ke tipe kosong atau tidak menunjuk ke data jenis tertentu.
Saat memanggil memori dinamis, program hanya menggunakan alamat murni yang dibawa kembali oleh fungsi tersebut, dan tidak menggunakan atribut yang menunjukkan tipe data mana. Jika Anda ingin menggunakan alamat ini, alamat tersebut harus dikonversi.
Misalnya:
int *p;
p=(int*)malloc(100);
Kasus:
Buat data dinamis, masukkan skor 5 siswa, dan gunakan fungsi untuk memeriksa apakah ada siswa dengan poin kurang dari 60, dan keluarkan skor yang tidak memenuhi syarat;
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
-
- int main()
- {
- void check(int * p);
- int *p1, i;
- p1 = (int *)malloc(5 * sizeof(int));
- for (i = 0; i < 5; i++)
- {
- scanf("%d", p1 + i);
- }
- check(p1);
- return 0;
- }
- void check(int * p)
- {
- int i;
- printf("they are fail:n");
- for (i = 0; i < 5; i++)
- {
- if (*(p+i) < 60)
- printf("%d ", *(p + i));
- }
- }
hasil operasi:
Analisis hasil:
Tidak ada array yang ditentukan dalam program ini, tetapi area alokasi bebas dinamis dibuka untuk digunakan sebagai array.
Dalam fungsi malloc, tidak ada nilai spesifik yang diteruskan secara langsung untuk mengalokasikan ruang dinamis. Sebaliknya, sizeof digunakan untuk menghitung jumlah byte bilangan bulat sistem, dan kemudian 5 elemen dibuat. Gunakan p untuk menunjuk ke alamat byte pertama dan mengubahnya menjadi tipe int, dan p+1 menunjuk ke elemen berikutnya.
Tulis fungsi untuk membuat daftar tertaut dinamis dengan data untuk 4 siswa.
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
-
- #define LEN sizeof(struct Student)
-
- struct Student
- {
- long num;
- float score;
- struct Student * next;
- };
-
- int n;
- struct Student * creat(void)
- {
- struct Student * head, *p1, *p2;
- n = 0; p1 = p2 = malloc(LEN);
- scanf("%ld%f", &p1->num, &p1->score);
- head = NULL;
- while (p1->num != 0)
- {
- n = n + 1;
- if (n == 1)
- head = p1;
- else p2->next = p1;
- p2 = p1;
- p1 = (struct Student *)malloc(LEN);
- scanf("%ld%f", &p1->num, &p1->score);
- }
- p2->next = NULL;
- return (head);
- }
-
- int main()
- {
- struct Student * pt;
- pt = creat();
- printf("n num:%ld score:%5.2fn", pt->num, pt->score);
- return 0;
- }
-
-
hasil operasi:
Analisis hasil: Untuk membuat daftar tertaut dinamis, pertama-tama tentukan tiga penunjuk struktur, lalu fungsi malloc digunakan untuk membuat simpul. Ketiga penunjuk struktur menunjuk ke simpul ini, lalu p1 menggunakan fungsi malloc untuk membuat simpul dan p2 Selanjutnya menunjuk ke node yang dibuat, p2=p1, p1 membuat p2. Selanjutnya menunjuk ke node yang dibuat, p2=p1....sampai nilai elemen di p1 adalah 0. Selanjutnya p2 tidak menunjuk ke node yang dibuat. node yang baru dibuat. Node menunjuk ke NULL. Dengan cara ini, daftar tertaut dinamis dibuat. Head menunjuk ke node pertama, dan itu adalah node kepala.
Masukan dan keluaran daftar tertaut dinamis:
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
-
- #define LEN sizeof(struct Student)
-
- struct Student
- {
- long num;
- float score;
- struct Student * next;
- };
- int n;
- struct Student * creat(void)
- {
- struct Student * head, *p1, *p2;
- head = NULL;
- n = 0;
- p2 = p1 = malloc(LEN);
- scanf("%ld%f", &p1->num, &p1->score);
- while (p1->num != 0)
- {
- n = n + 1;
- if (n == 1)
- head = p1;
- else
- p2->next = p1;
- p2 = p1;
- p1 = malloc(LEN);
- scanf("%ld %f", &p1->num, &p1->score);
- }
- p2->next = NULL;
- return head;
- }
-
- void print(struct Student * p)
- {
- do
- {
- printf("%ld %5.2fn", p->num ,p->score);
- p=p->next;
- } while (p->num != NULL);
- }
-
- int main(void)
- {
- struct Student * pt;
- pt = creat();
- print(pt);
- return 0;
- }
hasil operasi:
Terkadang, Anda ingin menyimpan berbagai jenis variabel dalam unit memori. Misalnya, letakkan variabel integer, variabel karakter, dan variabel floating-point dalam unit memori yang dimulai dari alamat yang sama . Bagian dari struktur memori disebut "penyatuan".
Tentukan bentuk umum serikat pekerja:
nama serikat pekerja
{
Daftar anggota;
}Daftar variabel;
Misalnya:
serikat Data
{
int saya;
karakter ch;
mengapung f;
Bahasa Indonesia: }a,b,c;
Panjang memori yang ditempati oleh variabel struktur adalah jumlah dari panjang memori yang ditempati oleh masing-masing anggota; sedangkan panjang memori yang ditempati oleh suatu gabungan adalah panjang anggota terpanjang.
Hanya variabel gabungan yang telah ditentukan sebelumnya yang dapat direferensikan. Perhatikan bahwa kami tidak mereferensikan variabel gabungan tetapi anggota dari variabel gabungan yang direferensikan.
ai mengacu pada variabel integer dalam variabel gabungan;
a.ch mengacu pada variabel karakter dalam variabel gabungan;
af mengacu pada variabel riil dalam variabel gabungan;
1. Segmen memori dapat digunakan untuk menyimpan beberapa tipe anggota yang berbeda, namun hanya satu yang dapat disimpan pada setiap saat, bukan beberapa pada saat yang bersamaan.
2. Variabel gabungan dapat diinisialisasi, tetapi hanya ada satu konstanta di tabel inisialisasi.
3. Anggota variabel gabungan adalah anggota yang ditugaskan terakhir kali, dan variabel asli sebelumnya ditimpa dan diganti.
4. Alamat variabel gabungan sama dengan alamat anggotanya.
5. Anda tidak dapat memberikan nilai pada nama variabel gabungan, atau mencoba mereferensikan nama variabel untuk mendapatkan nilai.
Jika beberapa variabel hanya memiliki sedikit kemungkinan nilai, maka variabel tersebut dapat didefinisikan sebagai tipe enumerasi; yang disebut enumerasi adalah membuat daftar nilai yang mungkin satu per satu.
Mendeklarasikan tipe enumerasi dimulai dengan enum;
eunm Hari kerja{min,sen,sel,rab,kam,jum,sab};
Di atas mendeklarasikan tipe enumerasi enum Hari Kerja. Tipe ini kemudian dapat digunakan untuk mendefinisikan variabel.
enum Hari kerja hari kerja,akhir pekan;
Diantaranya, hari kerja dan akhir pekan didefinisikan sebagai variabel pencacahan, dan tanda kurung kurawal disebut elemen pencacahan atau konstanta pencacahan.
Bentuk umum mendeklarasikan tipe enumerasi:
enum [nama enumerasi] {daftar elemen enumerasi};
Contoh:
Ada 5 jenis bola kecil di dalam saku: merah, kuning, biru, putih dan hitam. Keluarkan 3 bola dari tas setiap kali dan tanyakan cara yang mungkin untuk mendapatkan 3 bola dengan warna berbeda dan susunlah;
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
-
- int main()
- {
- enum Color {red,yellow,bule,white,black};
- enum Color i, j, k, pri;
- int n, loop;
- n = 0;
- for (i = red; i <= black; i++)
- for (j = red; j <= black; j++)
- if (i != j)
- {
- for (k = red; k <= black; k++)
-
- if ((k != i) && (k != j))
- {
- n++;
- printf("%d ", n);
- for (loop = 1; loop <= 3; loop++)
- {
- switch (loop)
- {
- case 1:pri = i; break;
- case 2:pri = j; break;
- case 3:pri = k; break;
- default:break;
- }
-
- switch (pri)
- {
- case red:printf("%s ", "red"); break;
- case yellow:printf("%s ", "yellow"); break;
- case bule:printf("%s ", "bule"); break;
- case white:printf("%s ", "white"); break;
- case black:printf("%s ", "black"); break;
- default:break;
- }
- }
- printf("n");
- }
- }
- printf("n total:%dn", n);
- return 0;
- }
hasil operasi:
Gunakan typedef untuk menentukan nama tipe baru untuk menggantikan nama tipe yang ada;
1. Cukup ganti nama tipe asli dengan nama tipe baru.
Misalnya:
typedef int Integer;
typedef float Nyata;
Jadi, dua baris berikut ini ekuivalen:
int i,j;——— Bilangan bulat i,j;
2. Beri nama tipe sederhana alih-alih metode representasi tipe kompleks
Beri nama tipe baru untuk mewakili tipe struktur:
tipedef struct
{
int bulan;
......
} Data;
Kemudian gunakan nama tipe baru Data untuk mendefinisikan variabel;
Data ulang tahun;
Data * p;
Beri nama tipe baru, bukan tipe array:
tipedef int Num[100];
Nomor a;
Beri nama tipe baru untuk mewakili tipe penunjuk:
typedef char * String;
Tali p,a[10];
Beri nama tipe baru untuk mewakili penunjuk ke suatu fungsi;
typedef int (* Penunjuk)();
Penunjuk p1,p2;
Ringkasan: Menurut cara mendefinisikan variabel, ganti nama variabel dengan nama tipe baru, dan tambahkan typedef di depan untuk menyatakan bahwa nama tipe baru mewakili tipe aslinya.
typetef hanya menentukan nama tipe baru untuk tipe yang sudah ada, tetapi tidak membuat tipe baru.
typetef dan #define memiliki kesamaan yang dangkal.
typedef int Hitung
#define Hitung int
Fungsinya menggunakan Count bukan int, namun nyatanya berbeda. #define diproses pada tahap pra-kompilasi, hanya dapat digunakan sebagai pengganti string sederhana, sedangkan typedef diproses pada tahap kompilasi. Ini sebenarnya bukan pengganti yang sederhana. Sebaliknya, nama tipe baru dihasilkan dan variabel ditentukan.