題目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;
}