1. 程式人生 > >資料結構--連結串列(C實現)

資料結構--連結串列(C實現)

連結串列是學習資料結構的基礎,何為資料結構,簡單來說就是研究資料的儲存問題,演算法是對資料的操作問題,儲存主要是個人的儲存和個人與個人的關係的儲存,研究如何將我們現實生活中各種事物及其關係的儲存。
連結串列的優缺點(相比於同是線性結構的陣列): 1.空間沒有限制 2.插入元素速度快 。但是存取速度不如陣列!
重點–排序 插入 刪除 節點的演算法
在這裡插入圖片描述

/*
	2018年11月19日18:06:26  連結串列程式 

*/ 
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct node 
{
	int data ;
	struct node * pnext ;
} NODE ,* PNODE ;

//   函式宣告 
PNODE create_list (void) ;
void  traverse_list (PNODE phead )  ;  //連結串列的遍歷
bool is_empty (PNODE phead) ; 
int length_list (PNODE phead) ;
void insert_list (PNODE phead,int pos,int val) ;  //在第pos個節點後面插入節點  數值是val 
void delete_list (PNODE phead,int pos) ;  //刪除第pos個節點 
void sort_list (PNODE phead) ;
int main (void)
{
	PNODE phead = NULL ;
	phead = create_list () ;
	traverse_list (phead) ;
	
	printf ("該連結串列的長度是length=%d\n",length_list(phead)) ;
	
	insert_list (phead , 3  ,9) ;
	printf ("在第三個元素後面插入 9\n") ;
	traverse_list (phead) ;
	printf ("在刪除第二個元素\n") ;
	delete_list (phead , 2) ;
	traverse_list (phead) ;  	
	sort_list (phead) ;
	traverse_list (phead) ;
	
	return 0 ;
}

PNODE create_list (void)
{
	PNODE phead = (PNODE) malloc (sizeof (NODE)) ;
	if (NULL == phead)
	{
		printf ("分配記憶體出錯!\n") ;
		exit (-1) ;
	}
	int len ;
	int val ; 		// 存放臨時值
	int i ;
	
	printf ("請輸入節點個數len = ") ;
	scanf ("%d", &len) ;
	
	phead->pnext = NULL ;
	PNODE ptail = phead ;    //ptail 是尾結點 
	
	for (i=0; i<len; i++)
	{
		printf ("請輸入第%d個節點的數值:",i+1) ;
		scanf ("%d",&val) ;
		
		PNODE pnew = (PNODE) malloc(sizeof (NODE)) ;
		pnew->data = val ;
		ptail->pnext = pnew ;
		pnew->pnext = NULL ;
		ptail = pnew ;
					
		} 
	
	return phead ;
}

void traverse_list (PNODE phead)
{ 
	//  錯誤寫法   原因是頭結點不存放資料 phead->data  是個垃圾值 
	/*while (phead->pnext != NULL)
	{
		printf ("%d  ",phead->data) ;
		phead = phead->pnext ;
	}
	
	輸入 : 1   2   3     輸出結果 213242  1    2 
	
	*/ 
	PNODE p = phead->pnext ; 
	//while (p->pnext !=NULL )    這樣輸出  少一個最後資料  這樣理解  尾結點的資料域是NULL,即他指向的下個節點的地址是NULL 
	while (p != NULL ) 
	{
		printf ("%d   ",p->data) ;
		p = p->pnext ;
		
	}
	printf ("\n") ;
	return ;
	
}

bool is_empty (PNODE phead)
{
	if (phead->pnext ==NULL )
		return true ;
	else 
		return false ;
	
}

int length_list (PNODE phead)
{
	int i = 0;
	PNODE p  = phead->pnext ;
	while (p != NULL)
	{
		i++;
		p = p->pnext ;
	}
	return i ;
} 

void insert_list (PNODE phead,int pos,int val)  //在第pos個節點後面插入節點  數值是val 
{
	PNODE pnew = (PNODE) malloc (sizeof (NODE)) ;
	pnew->data = val ;
	PNODE p = phead->pnext ;    //p  指向首節點
	int i ;
	for (i=1; i<pos; i++)
	{
		p = p->pnext ;
	} 
	pnew->pnext = p->pnext ;
	p->pnext = pnew ;
	return ;
	
}

void delete_list (PNODE phead,int pos)  //刪除第pos個節點 
{
	PNODE p = phead->pnext ; 
	int i ;
	for (i=1;i<pos-1;i++)
	{
		p = p->pnext ;
	}
	
	PNODE t = p->pnext ; 
	p->pnext = p->pnext->pnext ;
	free (t) ;
	
	return ;
}

void sort_list (PNODE phead)
{
	int i ,j ;
	PNODE p,q ;
	int len = length_list (phead) ;
	for (i=0,q=phead->pnext; i<len-1; i++,q=q->pnext)
	{
		for (j=0,p=phead->pnext; j<len-1-i; j++,p=p->pnext)
		{
			if (p->data > p->pnext->data)
			{
				int t ;
				t = p->data;
				p->data = p->pnext->data; 
				p->pnext->data = t;
			}
		}
		
	}
	
	
}