小螞蟻學習C語言(31)——C語言初識鏈表(下)

    寫一個鏈表的小案例,體會一下鏈表的存儲特色,和數組的區別,以及指針的運用方法。
數組

/*
	鏈表結構
	流程:
		建立結構體
		一、建立頭指針,用於保存頭結點的指針
		二、建立頭結點,保存首節點指針
		三、動態建立鏈表
		四、輸出
*/
# 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函數

相關文章
相關標籤/搜索