1. 程式人生 > >c語言實現連結串列及其基本操作

c語言實現連結串列及其基本操作

介紹

       連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。

和順序表的區別:

     順序表使用陣列儲存線形的元素,其特點是可以隨機存取,但是,因為邏輯上相鄰的元素物理上也相鄰,所以插入刪除需要移動元素。連結串列使用指標連結串列示線形表元素的邏輯關係,插入和刪除只需修改指標,不能隨機存取。

程式碼實現

typedef int DataType;
typedef struct Node
{//結構實現
	DataType data;
	struct Node* next;   
}Node, *PNode;
void InitList(PNode* PHead)//初始化
{
	assert(PHead);
	*PHead = NULL;
}

PNode ByeNode(DataType data)//申請一個結點
{
	PNode newNode = NULL;
	newNode = (PNode)malloc(sizeof(Node));
	if (NULL == newNode)
	{
		printf("out of memory.\n");
		exit(1);
	}
	else
	{
		newNode->data = data;
		newNode->next = NULL;
	}
	return newNode;
}
void PopBack(PNode* PHead)//尾刪
{
	assert(PHead);
	if (NULL == *PHead)
	{
		return;
	}
	else if(NULL == (*PHead)->next)
	{
		PNode TempNode = *PHead;
		free(TempNode);
		TempNode = NULL;
		*PHead = NULL;
	}
	else
	{
		PNode PCur = *PHead;
		while (PCur->next->next)
		{
			PCur = PCur->next;
		}
		PCur->next = NULL;
	}
}

void PushBack(PNode* PHead, DataType data)//尾插
{
	assert(PHead);
	if (NULL == *PHead)
	{
		*PHead = ByeNode(data);
	}
	else
	{
		PNode PCur = NULL;
		PCur = *PHead;
		while (PCur->next)
		{
			PCur = PCur->next;
		}
		PCur->next = ByeNode(data);
	}
}

void PushFront(PNode *PHead, DataType data)//頭插
{
	assert(PHead);
	PNode PreNode = NULL;
	PNode Node = ByeNode(data);
	PreNode = *PHead;
	Node->next = PreNode;
	*PHead = Node;
}

void PopFront(PNode *PHead)//頭刪
{
	assert(PHead);
	PNode PreNode = *PHead;
	if (NULL == *PHead)
	{
		return;
	}
	else if (NULL == (*PHead)->next)
	{
		*PHead = NULL;
	}
	else
	{
		*PHead = PreNode->next;
		free(PreNode);
		PreNode = NULL;
	}
}
PNode Find(PNode* PHead, DataType data)//查詢
{
	assert(PHead);
	PNode PCur = *PHead;
	while (PCur)
	{
		if (data == PCur->data)
			break;
		PCur = PCur->next;
	}
	return PCur;
}

void Destroy(PNode* PHead)//銷燬
{
	assert(PHead);
	PNode PCur = *PHead;
	while (PCur->next)
	{
		PNode Dnode = PCur;
		PCur = PCur->next;
		free(Dnode);
		Dnode = NULL;
	}
}

int Empty(PNode PHead)//判空
{
	if (NULL == PHead)
		return 0;
	else
		return 1;
}

int Size(PNode PHead)//求連結串列中結點的個數
{ 
	PNode Node = PHead;
	DataType num = 0;
	while (Node)
	{
		num++;
		Node = Node->next;
	}
	return num;
}

void PrintList(PNode* PHead)//列印單鏈表
{
	PNode PCur = *PHead;
	assert(PHead);
	while (PCur)
	{
		printf("%d->",PCur->data);
		PCur = PCur->next;
	}
	printf("NULL\n");
}

void Insert(PNode pos, DataType data)//在data後插入結點
{
	PNode newNode = ByeNode(data);
	PNode PreNode = pos;
	newNode->next = PreNode->next;
	PreNode->next = newNode;
}