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