删除指定结点
流程:判断传入数据和pos的位置是否符题意——找到删除位置的前一个结点,找到后要判断所找的位置是否越界——删除指定结点。代码:
//删除指定结点
int Delete_Pos(Node* h, int pos)
{
if (NULL == h || pos < 1)
{
return FALSE;
}
Node* tmp = h;
int i;
for (i = 0; i < pos - 1; i++)
{
if (NULL == tmp->next)
{
break;
}
tmp = tmp->next;
}
if (NULL == tmp)
{
printf ("删除位置越界");
return FALSE;
}
Node* p = tmp->next;
tmp->next = p->next;
free(p);
return TRUE;
}
和头指针的区别:不需要考虑空表的情况。
逆序
流程:先后判断传入数据是否正确,是否为空表,是否只有一个结点——从前往后,3个为一组,将前两个指向调换,以此为循环向后遍历直到结束,结束标志为一组中第二个为NULL——最后一步,将逆序后的最后一个指向NULL,头指针 h 指向逆序后的第一个。(原理和头指针一样,由于头结点的存在导致代码略有不同)
代码:
//逆序
int Reverse_List(Node* h)
{
if (NULL == h || NULL == h->next
|| NULL == h->next->next)
{
return FALSE;
}
Node* pre = h->next;
Node* cur = h->next->next;
Node* tmp;
while (cur)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
//最终操作略有差异
h->next->next = NULL;
h->next = pre;
return TRUE;
}
删除数据
流程:判断传入数据的准确性——保存头结点的地址,寻找所要删除的数据,并记录下tmp->next——判断记录的是否为空,不为空则删除那个结点
代码:
//删除数据
int Delete_Data(Node* h, LinkData data)
{
if (NULL == h)
{
return FALSE;
}
Node* tmp = h;
while (tmp->next)
{
if (data == tmp->next->data)
{
break;
}
tmp = tmp->next;
}
if (NULL == tmp->next)
{
return FALSE;
}
Node* p = tmp->next;
tmp->next = p->next;
free(p);
return TRUE;
}
查找元素
流程:判断传入数据是否正确——保存第一个结点的地址,遍历知道找到所要找的元素,保存下标。没找到则返回FALSE。代码:
//寻找元素
int Find_Element(Node* h, LinkData data, int* x)
{
if (NULL == h)
{
return FALSE;
}
Node* tmp = h->next;
int k = 1;
while (tmp)
{
if (data == tmp->data)
{
*x = k;
}
k++;
tmp = tmp->next;
}
return FALSE;
}
获取顺序表中的元素:通过位置获取
流程:判断传入数据的准确性——遍历到pos位置处,将pos处的数据保存到*x中。代码:
// 获取顺序表中的元素:通过位置获取
int Get_Element(Node* h, int pos, int *x)
{
if (NULL == h || pos < 1)
{
return FALSE;
}
Node* tmp = h;
int i;
for (i = 0; i < pos; i++)
{
if (NULL == tmp)
{
break;
}
tmp = tmp->next;
}
//判断tmp是否为空
if (NULL == tmp)
{
return FALSE;
}
else
{
*x = tmp->data;
}
return TRUE;
}
获取长度
流程:判断传入数据是否正确——从第一个节点遍历到最后一个结点,计算共有多少结点。代码:
//获取长度
int Get_Len(Node * h)
{
if (NULL == h)
{
return FALSE;
}
int count = 0;
Node* tmp = h;
while (tmp->next)
{
count++;
tmp = tmp->next;
}
return count;
}
清除列表
流程:利用Delete_Pos一个一个清除。代码:
int Clean_List(Node * h)
{
if (NULL == h)
{
return FALSE;
}
Node *tmp = h;
while (tmp->next)
{
Delete_Pos(h, 1);
}
return 0;
}
输出显示
// 输出显示
void Display(Node *h)
{
if (NULL == h)
{
return;
}
int count = 0;
Node *tmp = h->next;
while (tmp)
{
printf (++count % 4 ? "%8d" : "%8d\n", tmp->data);
tmp = tmp->next;
}
printf ("\n");
}
销毁链表
原理:利用Clean_List销毁,最后要释放空间,防止内存泄露
//销毁链表
int Destroy(Node *h)
{
if (NULL == h)
{
return FALSE;
}
Clean_List(h);
free(h);
return TRUE;
}