/***************** * 經過結構體,創建動態鏈表,並輸出鏈表。 * *******************/ #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define LEN sizeof(struct student) //宏定義 將LEN 替換爲student 結構體的大小數值 struct student *create(); //聲明建立新鏈表(節點)(結構體)函數,返回該鏈表的頭地址(指針),(尾部添加節點方法) void print(struct student *head); // 打印鏈表函數(此處爲函數聲明, //print函數()內的形參無關緊要,有則主要給編程人員看的) struct student //定義結構體類型,即每一個建立的節點(結構體)內包含什麼類型的數據 { long num; float score; struct student *next; //用來鏈接下一個結構體的指針 }; int n; //全局變量,用來記錄建立了多少個結構體 void main() { struct student *stu; //定義一個指針類型的結構體stu stu = create(); //調用建立新節點(結構體)函數create()並將其建立成的鏈表頭地址(指針)賦給stu指針 print(stu); //用create()返回的指針做實參調用函數print() printf("\n\n"); system("pause"); //此處system函數()內帶雙引號,中文的任意鍵退出提示 } struct student *create() //定義創捷指針結構體的函數 { struct student *head; // 定義指針結構體變量*head, *p1,*p2,用於存放新建立的指針結構體 struct student *p1,*p2; p1 = p2 = (struct student *)malloc(LEN); //LEN是student結構體的大小 //用動態內存分配函數malloc()分配內存給指針結構體p1和p2 printf("please enter the num : "); //指針結構體p1先得到數據 scanf("%ld",&p1->num); printf("please enter the score : "); scanf("%f",&p2->score); head = NULL; //定義頭指針爲空值 n = 0; //初始話計數器 while(p1->num) //判斷指針結構體p1成員所得到的數據是否爲0,否時(即表示p1獲取數據成功)則繼續一下執行 { n++; // 節點建立記數器+1 if(1==n) //當建立的爲第一節點時, { head = p1; //將指針結構體p1的首地址賦給指針接頭體head(即讓頭指針結構體指向p1) } else //如果第一個以後建立的指針接頭體 { p2->next = p1; //將p2指針結構體尾地址指向指針結構體p1首地址 } p2 = p1; //讓p2指向p1,爲後續p1的重新獲取數據步驟做備份 p1 = (struct student *)malloc(LEN); //再次使用動態內存分配函數給p1指針結構體分配特定的內存空間(此時即爲再次建立新節點(指針結構體)) printf("\nPlease enter the num :"); //新指針結構體p1得到數據 scanf("%d",&p1->num); printf("\nPlease enter the score :"); scanf("%f",&p1->score); } p2->next = NULL; //當循環不執行(即p1->num,得到0值時) 將p2指針結構體成員 p2->next指向NULL即0,表示鏈表的結束 return head; //函數struct student *create() 返回鏈表的頭地址。 } void print(struct student *head) //定義print函數,接收鏈表頭地址(實參),執行運行,此處的形參(類型和名稱)必需要有 { struct student *p; // 定義一個新的指針結構體變量p printf("\nThere are %d records!\n\n", n); p = head; //所定義的新的p是用於接收函數struct student *create()返回回來的鏈表頭地址,此地址在print函數內用head這個指針來傳遞 if( p ) //判斷鏈表的頭地址是否爲空,(即有沒有建立一個新的節點(指針結構體)) { do { printf("學號爲 %d 的成績是: %f\n", p->num, p->score);//注意指針結構體的成員引用格式:指針結構體名->成員名; //將頭地址(指針接頭體struct student *head) 的成員打印出來 p = p->next; //將頭地址(指針接頭體struct student *head) 指向下一節點頭地址。 //尾成員存放的地址(p->next內的地址即爲下一個節點(指針結構體)的頭地址) }while( p ); //直到p值爲NULL,(即0),退出循環。 } }