寫一個鏈表的小案例,體會一下鏈表的存儲特色,和數組的區別,以及指針的運用方法。
數組
/* 鏈表結構 流程: 建立結構體 一、建立頭指針,用於保存頭結點的指針 二、建立頭結點,保存首節點指針 三、動態建立鏈表 四、輸出 */ # include <stdio.h> # include <malloc.h> # include <stdlib.h> struct Node { int data; struct Node * pNode; }; //函數聲明(居然忘了(ToT)/~~~) struct Node * create_list(void); void traverse_list(struct Node *); int main(void) { struct Node * pHead = NULL; //定義一個頭指針(NULL必須大寫) pHead = create_list(); //建立一個鏈表,把頭結點的指針傳遞給頭指針元素保存 printf("\n\n"); traverse_list(pHead); //輸出整個鏈表 return 0; } struct Node * create_list(void) { int len; int i; int val; //建立一個頭結點 struct Node * pHead = (struct Node *)malloc(sizeof(struct Node)); if( NULL == pHead ) { printf("頭結點建立失敗\n"); exit(-1); } pHead -> pNode = NULL; /* 爲了解決在下面for循環中,每次都會把指針交給頭結點保存這個問題, 須要另外建立一個指針變量 */ struct Node * pTail = pHead; printf("請輸入鏈表的個數:"); scanf("%d",&len); printf("\n"); for(i = 0; i < len; i++) { printf("請輸入第%d個元素:",i+1); scanf("%d",&val); struct Node * pNew = (struct Node *)malloc(sizeof(struct Node)); pNew -> data = val; pNew -> pNode = NULL; /* 第一次寫到這裏的時候,寫的是 pHead -> pNode = pNew; 第一次循環的時候是正確的,把首結點的指針保存到了頭結點 第二次的時候就不對了,由於仍是會把第二個元素的指針保存到頭結點中…… 因此,須要建立另一個,用以存放上一個元素的地址 */ pTail -> pNode = pNew; /* 將新建立的元素的地址交給pTail保存,用於存放下一個新建立的地址。 */ pTail = pNew; } //將頭結點的地址返回 return pHead; } void traverse_list(struct Node * pHead) { struct Node * p = pHead -> pNode; printf("輸出全部鏈表元素:"); while( NULL != p) { printf("%d ", p -> data); p = p -> pNode; //寫到這裏我好像理解了「頭結點的目的是爲了方便對鏈表的操做」這句話的含義 } printf("\n"); } /* VC++6.0 輸出的結果是: ==================================== 請輸入鏈表的個數:3 請輸入第1個元素:1 請輸入第2個元素:2 請輸入第3個元素:3 輸出全部鏈表元素:1 2 3 ==================================== 遇到的錯誤: 1,NULL必需要大寫 (╯▽╰) 2,忘了寫函數的前置聲明 */
學PHP的小螞蟻 博客 http://my.oschina.net/woshixiaomayi/blog函數