1. 程式人生 > >(一)資料結構之線性表的簡單實現:連結串列

(一)資料結構之線性表的簡單實現:連結串列

/* 查詢連結串列中第K個元素 */
List *FindKth( int K, List *PtrL )
{ 
	List *p = PtrL;
	int i = 1;
	while (p != NULL && i < K )
	{
		p = p->Next;
		i++;
	}
	if ( i == K ) return p;	/* 找到第K個,返回指標 */
	else return NULL;		/* 否則返回空 */
}

3.5 修改操作

/* 修改元素值 */
void Change( ElementType X, int i, List *PtrL)
{
	List *p;
	p = FindKth( i, PtrL ); /* 查詢第i個結點 */
	if ( p == NULL ) 
	{ 
		/* 第i-1個不存在,不能插入 */
		printf("the node of i-1 is not exist!\n");
		return ;
	}
	else
	{
		p->Data = X;
	}
}

3.6 完整的示例程式碼實現

/* 線性表的鏈式儲存 */
#include <stdio.h>
#include <stdlib.h>

/* 基本資料結構定義 */
typedef int ElementType;
typedef struct Node{
	ElementType Data;
	struct Node *Next;
} List;

/* 銷燬一個連結串列,釋放記憶體空間 */
void MakeDestroy(List *PtrL)
{
	List *PtrTemp = PtrL;
	List *PtrNext;
	while(PtrTemp)
	{
		PtrNext = PtrTemp->Next;
		free(PtrTemp);
		PtrTemp = PtrNext;
	}
}

/* 查詢連結串列中第K個元素 */
List *FindKth( int K, List *PtrL )
{ 
	List *p = PtrL;
	int i = 1;
	while (p != NULL && i < K )
	{
		p = p->Next;
		i++;
	}
	if ( i == K ) return p;	/* 找到第K個,返回指標 */
	else return NULL;		/* 否則返回空 */
}

/* 查詢連結串列中值為X的元素 */
List *Find( ElementType X, List *PtrL )
{
	List *p = PtrL;
	while ( p!=NULL && p->Data != X )
		p = p->Next;
	return p;
}

/* 在第i個結點位置上插入一個新結點 */
List *Insert( ElementType X, int i, List *PtrL )
{ 
	List *p, *s;
	if ( i == 1 ) 
	{ 
		/* 新結點插入在表頭 */
		s = (List *)malloc(sizeof(List)); /*申請、填裝結點*/
		s->Data = X;
		s->Next = PtrL;
		return s; /*返回新表頭指標*/
	}
	p = FindKth( i-1, PtrL ); /* 查詢第i-1個結點 */
	if ( p == NULL ) 
	{ 
		/* 第i-1個不存在,不能插入 */
		printf("the node of i-1 is not exist!\n");
		return NULL;
	}
	else 
	{
		s = (List *)malloc(sizeof(List)); /*申請、填裝結點*/
		s->Data = X;
		s->Next = p->Next; /*新結點插入在第i-1個結點的後面*/
		p->Next = s;
		return PtrL;
	}
}

/* 刪除第i個結點 */
List *Delete( int i, List *PtrL )
{ 
	List *p, *s;
	if ( i == 1 ) 
	{ 
		/* 若要刪除的是表的第一個結點 */
		s = PtrL; 								/*s指向第1個結點*/
		if (PtrL!=NULL) PtrL = PtrL->Next; 		/*從連結串列中刪除*/
		else return NULL;
		free(s); 								/*釋放被刪除結點 */
		return PtrL;
	}
	p = FindKth( i-1, PtrL ); /*查詢第i-1個結點*/
	if ( p == NULL ) 
	{
		printf("the node of i-1 is not exist!\n"); return NULL;
	} 
	else if ( p->Next == NULL )
	{
		printf("the node of i is not exist!\n"); return NULL;
	} 
	else 
	{
		s = p->Next; 		/*s指向第i個結點*/
		p->Next = s->Next; 	/*從連結串列中刪除*/
		free(s); 			/*釋放被刪除結點 */
		return PtrL;
	}
}

/* 修改元素值 */
void Change( ElementType X, int i, List *PtrL)
{
	List *p;
	p = FindKth( i, PtrL ); /* 查詢第i個結點 */
	if ( p == NULL ) 
	{ 
		/* 第i-1個不存在,不能插入 */
		printf("the node of i-1 is not exist!\n");
		return ;
	}
	else
	{
		p->Data = X;
	}
}

/* 遍歷這個連結串列中的元素 */
void Traversal(List *PtrL)
{
	List *p;
	p = PtrL;
	while(p)
	{
		printf("%d ", p->Data);
		p = p->Next;
	}
}


/* 求表長 */
int Length ( List *PtrL )
{ 
	List *p = PtrL; /* p指向表的第一個結點*/
	int j = 0;
	while ( p ) 
	{
		p = p->Next;
		j++; 		/* 當前p指向的是第 j 個結點*/
	}
	return j;
}


/* 程式入口 */
int main()
{
	int i, index;
	ElementType temp;
	List *node;
	List *list = NULL;		/* 防止野指標 */
	
	/* 向連結串列中插入五個元素 */
	printf("Input 5 numbers : ");
	for(i = 0; i < 5; i++)
	{
		scanf("%d", &temp);
		list = Insert(temp, i + 1, list);
	}

	printf("************************************Traversal*****************************\n");
	/* 列印連結串列中的元素 */
	Traversal(list);
	printf("Length = %d\n", Length(list));

	printf("************************************Delete********************************\n");
	/* 刪除一個元素 */
	list = Delete(3, list);
	Traversal(list);	
	printf("Length = %d\n", Length(list));

	printf("************************************Insert********************************\n");
	/* 插入一個元素 */
	Insert(100, 2, list);
	Traversal(list);	
	printf("Length = %d\n", Length(list));

	printf("************************************Change********************************\n");
	/* 插入一個元素 */
	Change(888, 1, list);
	Traversal(list);	
	printf("Length = %d\n", Length(list));

	printf("************************************Find**********************************\n");
	/* 查詢一個元素 */
	node = Find(100, list);
	Traversal(list);	
	printf("Length = %d, Value = %d\n", Length(list), node->Data);

	MakeDestroy(list);		/* 銷燬這個連結串列 */
	
	return 0;	
}