一、結構體的宣告;
我們把又一定聯絡的變數放在一起定義,這就是結構體,如下
struct student
int num;
char name[20];
float score;
}stu;
struct student a,b,c;
scanf("%d%s%f",&stu.num,stu.name,&stu.score);
以上宣告中,struct為structre的簡寫,是宣告結構體型別時必不可少的,後面的student是乙個結構體名,struct student合起來是乙個結構體型別,大括號內為內定義,定義的變數其實與普通變數並無區別,可單獨進行使用,而想使用這些變數,就必須用到大括號外的stu,stu是結構體變數,我們可以用「stu.score」這樣的語句來引用其中的變數。
在這裡,結構體名student與結構體變數stu可以自己取名字。stu也未必非要加在大括號後,也可另外宣告結構體變數如下明定義了3個為a,b,c,與stu同樣都僅僅是乙個指向結構體型別的變數而已。
當然,我們還可以定義乙個結構體陣列,即可以把「stu」改為「stu[20]」,這便是乙個結構體陣列,其中又20個元素,意思不難理解,就是相當於你同時定義了20個同樣的結構體陣列而已。
那麼好了,我們是不是也可以來定義乙個結構體型別的指標呢?當然。在上面的宣告之下,我們還可以定義乙個指標如下:
struct student *p;
p = &stu;
scanf("%d%s%d",&(*p).num,(*p).name,&(*p).score);
上述賦值方式每個「.」前面的()是不能少的,因為在所有的運算子中,「.」的優先順序是最高的,但我們這裡必須先運算*p,故括號不能丟,當然,我們其實還有一種更為常見的賦值方式如下:
scanf("%d%s%d",p->num,p->name,p->score);
這樣就能避免丟括號的問題了。
二、靜態鍊錶
鍊錶其實是一種重要的資料結構。它是動態進行分配儲存的一種結構。
鍊錶有乙個頭指標變數,我們一般用head來表示,而後就是結點,每乙個結點都有兩部分組成,一部分存放實際資料,即存放使用者所需要的資料,另乙個部分則存放下乙個結點實際資料的位址,一般我們把鍊錶建立在結構體變數中,如下:
struct student
int num;
float score;
struct student *next;
}a[3];
在結構體中定義了乙個指向該結構體型別的指標,那我們該如何使用呢?
首先,在使用前,我們得先定義乙個該結構體型別的指標指向此結構體的首位址如「struct student *p = a;」,其次,我們還得把結構體變數的尾位址「a[2].next」指向空位址「null」,這樣我們才能結束它。如下**段:
#include struct student
;int main()
head = &a[0];
a[0].next = &a[1];
a[1].next = &a[2];
a[2].next = null;
p = head;
printf("學生資訊為:\n");
while(p != null)
return 0;
}
這就是靜態鍊錶的使用方法。 結束結構體與簡單鍊錶
1620 7 唐大智 2016年12月6日 連續第六十六天總結 內容 a 1 在定義結構體型別時,成員不能初始化,也不能指定除了static以外的儲存型別。2 結構體型別可以含自身型別的指標成員,但不能含自身型別的普通成員。3 型別定義 型別定義的本質是對乙個已存在的型別重新命名,並不是定義新的資料...
2018 2 2 鍊錶預習
1.頭指標和頭結點的異同 頭指標 頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標 頭指標具有標示作用,所以常以頭指標冠以鍊錶的名字 無論鍊錶是否為空,頭指標均不為空。頭指標是鍊錶的必要元素。頭結點 頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其資料域一般無...
結構體鍊錶小結
引用自身的結構體,乙個結構體中有乙個或多個成員的基型別就是本結構體型別時,說明這個結構體可以引用自己,所以稱作引用自身的結構體。例如下面的結構體 struct link a p是乙個可以指向struct link型別變數的指標成員,這樣,a.p a就是合法的表示式。那麼,這有什麼意義呢?這樣的意義就...