頭指針鏈表指定位置的刪除
實現:1,先判斷傳入的數據是否正確,然后再判斷是否為空表,最后判斷pos的值是否滿足題意 2,分刪除位置為1和不為1討論:為1時,直接將h指向第二個節點并釋放第一個節點的空間(定義一個tmp指向第一個節點);不為1時,找到插入位置的前一個節點(利用tmp遍歷),其中需要考慮pos的值是否會造成越界 3,最后刪除pos處的節點,注意釋放空間防止內存泄漏。
// 刪除pos處的節點
int Delete_Pos(Node** h, int pos)
{// 判斷傳入數據是否正確、是否為空表、pos是否合題意if (NULL == h || NULL == *h || pos < 1){return FALSE;}Node* tmp = *h; // 用于保存指針// 如果刪除的第一個if (1 == pos){*h = tmp->next; // h指向第二個節點free(tmp); // 釋放空間}else{int i;for (i = 0; i < pos - 2; i++) // tmp遍歷到pos前一個節點{// 如果tmp->next不為空,那tmp也不為空if (NULL == tmp->next){break;}tmp = tmp->next;}if (NULL == tmp->next) // 如果tmp->next為空則結束{printf ("刪除位置越界\n");return FALSE;}Node* p = tmp->next; // p用來保存刪除位置的指針,釋放空間用tmp->next = p->next; // 將pos處節點一處鏈表free(p); // 釋放刪除節點的空間}return TRUE;
}
頭指針鏈表的逆序
實現:先判斷傳入數據的正確性,然后判斷是否是空表,最后判斷是否只有一個節點——從前往后,3個為一組,將前兩個指向調換,以此為循環向后遍歷直到結束,結束標志為一組中第二個為NULL——最后一步,將逆序后的最后一個指向NULL,頭指針 h 指向逆序后的第一個。
// 逆序
int Reverse_List(Node** h)
{// *h==NULL代表空表 (*h)->next代表只有一個節點if (NULL == h || NULL == *h ||NULL == (*h)->next){return FALSE;}// 定義3個指針來實現逆序Node* pre = *h;Node* cur = (*h)->next;Node* tmp;while (cur) // 從前往后依次逆序{tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}// 頭尾的處理(*h)->next = NULL; // 將第一個節點指向NULL*h = pre; // 頭指針 h 指向最后一個節點return TRUE;
}
頭指針鏈表的輸出
//輸出函數
void Display(Node* h)
{if (NULL == h) //判斷傳入數據是否正確{return;}int count = 0; //計數初始化while (h){printf (++count % 4 ? "%8d" : "%8d\n", h->data);h = h->next;}putchar ('\n');
}