删除指定结点
流程:判断传入数据和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;
}