資料結構筆試題——基於C語言的連結串列功能函式實現

Rice_rice發表於2024-04-23

題目1

題目要求如下:

/**

* @function name: LList_CntdmFind

* @brief 查詢連結串列中,倒數第k個位置上的節點

* @param :

​ @Head:連結串列頭節點

​ @k :倒數第k個位置

* @retval :int 型返回值;返回-1時即為失敗,返回0時表示成功;

* @date :2024/04/23

* @version 1.0

* @note

* CopyRight (c) 2023-2024 ni456xinmie@163.com All Right Reseverd

*/

int LList_CntdmFind(LList_t *Head, int k)
{
	LList_t *tmp1 = Head->next; // 用來遍歷
	int length = 0;				// 用來存放元素個數
	int i = 0;
	if (NULL == Head) // 判斷空表
		return -1;
	while (tmp1) // 計算元素個數
	{
		length++;
		tmp1 = tmp1->next;
	}
	if (length < k) // 如果k太大
	{
		printf("The k is invalid\n");
		return -1;
	}
	else if (length == k) // k正好是第一個
	{
		return Head->next->data;
	}
	else // 正常倒數
	{
		tmp1 = Head->next;
		for (i = 0; i < length - k; i++)
		{
			tmp1 = tmp1->next;
		}
		return tmp1->data;
	}
}

題目2

題目要求如下:

/**

* @function name: LList_DeleteMin

* @brief :刪除單連結串列中的最小值節點

* @param :

​ @Head:連結串列頭節點

* @retval :bool 型返回值;返回false時即為失敗,返回true時表示成功;

* @date :2024/04/23

* @version 1.0

* @note

* CopyRight (c) 2023-2024 ni456xinmie@163.com All Right Reseverd

*/

bool LList_DeleteMin(LList_t *Head)
{
	LList_t *tmp1 = Head->next;		// 用來遍歷
	LList_t *tmpFormer = Head;		// 用來存放目標指標前一個節點
	LList_t *tmpDest = Head->next;	// 用來存放目標指標
	DataType_t tmpMin = tmp1->data; // 用來存放最小值
	if (!tmp1)						// 如果是空表
	{
		printf("The list is NULL");
		return false;
	}
	if (!tmp1->next) // 只有一個元素,就刪掉
	{
		free(Head->next);
		Head = NULL;
		return true;
	}
	while (tmp1->next) // 兩個以上的元素,定位到最小元素
	{
		if (tmpMin > tmp1->next->data)
		{
			tmpMin = tmp1->next->data;
			tmpDest = tmp1->next;
			tmpFormer = tmp1;
		}
		tmp1 = tmp1->next;
	}
	tmpFormer->next = tmpDest->next; // 進行刪除操作
	tmpDest->next = NULL;
	free(tmpDest);
	return true;
}

相關文章