C語言的大BOSS 結構體 單鏈表的學習體會

2021-07-12 01:58:07 字數 1551 閱讀 2296

1.結構體:

本質上是一種在已有基本資料型別上覆合而成的資料型別,它可以像int、float等型別一樣使用(可以生成物件、指標、陣列等)。

注意結構體與結構體變數的區分:

如: struct student

stu, stu[10], *p;

stu, stu[10], p都是結構體變數(分別為結構體變數、結構體陣列、結構體指標)

而student則是結構體,與int地位等同。

2.陣列與鍊錶:

前者是連續的一塊儲存空間,後者是一般不連續的儲存空間。需要遍歷、排序時,他們的演算法從廣義上來說是一致的,但在具體實現上有所區別。

例如在氣泡排序時,前者利用 i,j起到計數和索引兩個作用;而後者則可用i、j單獨起計數作用,並定義結構體指標p和q來進行索引操作。主要原因還是兩種資料儲存方式的連續與不連續的區別。

3.關於指標與陣列

int a[10] = ;

for (int i=0; i<10; i++)

a是陣列的首位址,而指標本質上也是位址,因此

a[i]這種表達方式可以等價為 *(a+i)

在用結構體寫乙個簡易的學生資訊管理系統的時候

//構造動態一維陣列來存放學生資訊

parr = (struct student *)malloc(len * sizeof(struct student));

//模擬一下:

//parr = (int *)malloc(len * sizeof(int));

//這條語句實質上在記憶體裡建立了len個大小為int大小(4個位元組)

//即len*4個位元組的空間,並形成乙個陣列;

//而換成結構體型別後,也就相當於建立了能夠容納len個

//結構體物件的陣列。parr正是陣列的首位址,parr[i]

//可用於遍歷。

//能夠這樣的原因:

//使用malloc分配的記憶體空間在虛擬位址空間上是連續的。

//輸入,要用迴圈

for (int i=0; i"please enter the %dth

student's information:\n", i+1);

printf("age = ");

scanf("%d", &parr[i].age);

printf("score = ");

scanf("%f", &parr[i].score);

printf("name = ");

scanf("%s", parr[i].name);

}

4.廣義、狹義演算法與泛型

冒泡法作為一種思路,用在鍊錶的排序和用在陣列的排序寫出來的**不相同(或者說具體的實現不同)。從這種意義上來講,冒泡法這種思路是一種廣義演算法,但是具體的某種實現可以說是一種狹義演算法。

我說理解的泛型是一種泛化的、廣義化的抽象,比如陣列、鍊錶都抽象成容器,從而達到更高層次的統一。

比如陣列的i++遍歷和鍊錶的p=p->pnext遍歷看起來是不一樣的,但利用c++過載後賦予++符號新的含義用來表示p=p->pnext,則兩者就統一起來了。

結構體 單鏈表

結構體和陣列一樣,都是聚合型別,在進行整體初始化的時候只有一次機會,就是在定義的時候 但是可以區域性初始化 typedef與結構體 不加typedef時定義結構體 struct student student1 student1是結構體的乙個結構體變數,且student未定義,而結構體的名字叫做st...

C語言例題1 結構體與單鏈表的建立

祥見 c語言20題 問題描述 輸人若干個學生資訊 包括學號 姓名和成績 輸人學號為0時輸人結束,建立乙個單向鍊錶,再輸人乙個成績值,將成績大於等於該值的學生資訊輸出。試編寫相應程式。樣例輸入 1 zhang 78 2 wang 80 3 li 75 4 zhao 85080 樣例輸出 2 wang ...

c語言 資料結構 單鏈表

將線性表l a0,a1,an 1 中各元素分布在儲存器的不同儲存塊,稱為結點,通過位址或指標建立它們之間的聯絡,所得到的儲存結構為鍊錶結構,表中 ai的結點形式如圖表示 其中結點的data 域存放資料元素 ai,而 next 域是乙個指標,指向 ai的直接後繼 ai 1 所在的結點。單鏈表結構如下 ...