数据结构单向链表

单向链表的转置

转置的思想

(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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值