单向链表的转置
转置的思想:
(1) 将头节点与当前链表断开,断开前保存下头节点的下一个节点,保证后面链表能找得到,定义一个q保存头节点的下一个节点,断开后前面相当于一个空的链表,后面是一个无头的单向链表
(2) 遍历无头链表的所有节点,将每一个节点当做新节点插入空链表头节点的下一个节点(每次插入的头节点的下一个节点位置)
分别列出其他功能函数,包括单向链表的转置
//7.修改指定位置的数据 post 被修改的位置 data修改成的数据
int ChangePostLinkList(link_node_t *p, int post, datatype data)
{
//0.容错判断
if(post < 0 || post >=LengthLinkList(p))
{
perror("ChangePostLinkList");
return -1;
}
//1.将头指针指向被修改的节点
for(int i=0;i<=post;i++)
p=p->next;
//2.修改数据
p->data = data;
return 0;
}
//8.查找指定数据出现的位置 data被查找的数据 //search 查找
int SearchDataLinkList(link_node_t *p, datatype data)
{
//1.定义变量记录查找位置
int post=0;
//2.遍历链表,查找数据
while(p->next != NULL)
{
p=p->next;
if(p->data == data)
return post;
post++;
}
return -1;
}
//9.删除单向链表中出现的指定数据,data代表将单向链表中出现的所有data数据删除
int DeleteDataLinkList(link_node_t *p, datatype data)
{
//1.定义一个指针q指向头结点的写一个节点,此时可以看做q指向一个无头单向链表
link_list_t q = p->next;
//2.用q遍历链表,将每一个节点的数据域与data作比较,如果相同就删除该节点
while(q != NULL)
{
if(q->data == data)//如果相等,删除
{
p->next = q->next;
free(q);
q = p->next;
}
else//如果不相等,指针向后移动
{
p=p->next;
q=p->next;
}
}
return 0;
}
//11.清空单向链表
void ClearLinkList(link_node_t *p)
{
while (!IsEpLinkList(p))
DeletePostLinkList(p,0);
}
//10.转置链表
//解题思想:
//(1) 将头节点与当前链表断开,断开前保存下头节点的下一个节点,
//保证后面链表能找得到,定义一个q保存头节点的下一个节点,
//断开后前面相当于一个空的链表,后面是一个无头的单向链表
//(2) 遍历无头链表的所有节点,将每一个节点当做新节点
//插入空链表头节点的下一个节点(每次插入的头节点的下一个节点位置)
void ReverseLinkList(link_node_t *p)
{
//1.断开前
link_list_t q = p->next;
link_list_t temp = NULL;
//2.断开链表
p->next = NULL;
//3.遍历无头单向链表,依次插入头节点后面
while ( q != NULL)
{
temp = q->next;
q->next = p->next;
p->next = q;
q = temp;
}
}