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 所在的結點。單鏈表結構如下 ...