头指针链表指定位置的删除
实现: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');
}