1. 程式人生 > 實用技巧 >單鏈表—頭插法和尾插法

單鏈表—頭插法和尾插法

尾插法(帶頭結點)

/*********************************************/
/***********    帶頭結點的方法     **********/
/*******************************************/

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int data;			//資料域
	struct Node * pNext;//指標域
}NODE, * PNODE;         //由於使用了typedef, 所以NODE <=> struct Node  ,  PNODE <=> struct Node * 

PNODE create_list();				//建立一個連結串列
void traverse_list(PNODE pHead);	//遍歷整個連結串列並輸出
int main()
{
	PNODE pHead = NULL;  //頭指標為空,用來儲存頭結點的地址
	int val;			 //用來儲存刪除的元素
	int location;        //儲存查詢元素的位置 

	pHead = create_list(); //建立一個連結串列,並返回頭結點的地址給pHead

	traverse_list(pHead);  //遍歷整個連結串列

	return 0;
}
PNODE create_list()
{
	int len;      //用來存放有效節點的個數
	int i;
	int temp_val; //臨時存放使用者輸入結點資料域的值

	//分配一個不存放有效資料的頭結點
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(NULL == pHead)    {printf("分配失敗,程式終止!"); exit(-1);}

	PNODE pTemp = pHead; //臨時存放頭結點的地址,頭結點的位置不能變 
	pTemp->pNext = NULL;

	printf("請輸入您要生成的連結串列節點的個數: len = ");
	scanf("%d", &len);

	for(i = 0; i<len; i++)
	{
		printf("請輸入第%d個節點資料域的值 :", i+1); //正序輸入 
		scanf("%d", &temp_val);
		
		//迴圈一次分配一個存放有效資料的結點
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL ==pNew)     {printf("分配失敗,程式終止!"); exit(-1);}
		pNew->data = temp_val;
	
		//尾插法
		pTemp->pNext = pNew;
		pNew->pNext = NULL;  //每分配一個結點,這個結點就是最後一個,所以它的指標域(pNext)為空
		pTemp = pNew;        //保證前一個結點的指標域都指向後一個結點
	}

	return pHead;  //返回頭結點的地址
}
/*———————————————————————————————————————————————————————*/
void traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNext;  //頭結點的指標域賦給p,即頭結點賦給p 【注意區分頭結點和首結點】

	printf("連結串列的資料為:\n");
	while(NULL != p)
	{
		printf("%d ", p->data);
		p = p->pNext;        //下一個結點賦給p
	}

	printf("\n");
}

頭插法(不帶頭結點)


/***********************************************/
/***********    不帶頭結點的方法     **********/
/*********************************************/


#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int data;			//資料域
	struct Node * pNext;//指標域
}NODE, * PNODE;         //由於使用了typedef, 所以NODE <=> struct Node  ,  PNODE <=> struct Node * 

PNODE create_list();				//建立一個連結串列
void traverse_list(PNODE pFirst);	//遍歷整個連結串列並輸出
int main()
{
	PNODE pFirst = NULL;  //首指標為空,用來儲存首結點的地址
	int val;			  //用來儲存刪除的元素
	int location;        //儲存查詢元素的位置 

	pFirst = create_list(); //建立一個連結串列,並返回頭結點的地址給pHead

	traverse_list(pFirst);  //遍歷整個連結串列

	return 0;
}
/*———————————————————————————————————————————————————————*/
PNODE create_list()
{
	int len;      //用來存放有效節點的個數
	int i;
	int temp_val; //臨時存放使用者輸入結點資料域的值

	PNODE pFirst = NULL;  //首結點必須先賦值為空,因為它將作為尾結點的指標域 

	printf("請輸入您要生成的連結串列節點的個數: len = ");
	scanf("%d", &len);

	for(i = 0; i<len; i++)
	{
		printf("請輸入第%d個節點資料域的值 :", len-i); //逆序輸入值 
		scanf("%d", &temp_val);
		
		//迴圈一次分配一個存放有效資料的結點
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL ==pNew)     {printf("分配失敗,程式終止!"); exit(-1);}
		pNew->data = temp_val;
		
		//頭插法
		pNew->pNext = pFirst;
		pFirst = pNew;  
	}

	return pFirst;  //返回首結點的地址
}
/*———————————————————————————————————————————————————————*/
void traverse_list(PNODE pFirst)
{
	PNODE p = pFirst;  //首結點的指標域賦給p,即首結點賦給p 【注意區分頭結點和首結點】

	printf("連結串列的資料為:\n");
	while(NULL != p)
	{
		printf("%d ", p->data);
		p = p->pNext;        //下一個結點賦給p
	}

	printf("\n");
}