c语言链表冒泡排序 C语言问题:怎样实现对链表中两个结点的交换?
C语言问题:怎样实现对链表中两个结点的交换?
链表交换节点有两种方式:交换节点内容交换节点位置,如定义如下结构,分为数据部分和链表指针部分structdata{int num float score}struct stu{structdata struct stu*next}*head,*P1,*P2,*P3,*p4head->p1->p2->p3->p4交换节点的内容。节点的顺序保持不变。交换两个节点时,只交换数据部分,下一个指针不移动。例如,交换P1和P3(data)的内容:structudata t=P1->datap1->data=P3->datap3->data=t//这是可以的。为了保持链表的正常连接,需要重置next的值。这个过程有点复杂,例如:交换P1和P3的位置:最后更改为:head->p3->p2->p1->p4。首先,找到P1的头和P3的P2,然后开始重新分配链表的排列:1。(head)的新继承节点P1的头应成为P3(P4)3的原继承节点,P3(P2)的新继承节点应成为p14、P3的新继承节点,P1(P2)结构的原继承节点stu*p1p,*P3P,*pfor(P=headp!=nullp=P->next){如果(P->next==P1)p1p=P//找到P1的前向头如果(P->next==P3)P3P=P//找到P3的前体}p1p->next=P3//P3的前体节点的新后继节点成为P3的前体节点head->p3 struct stu*tnext=P1->next//保存P1(P2)的前体节点p1->next=P3->next//p1的新后继节点成为P3(P4)的前体节点p1->p4p3p->next=p1//P3当新后继节点成为p1 P2->p1p3->next=tnext//P3时,新后继节点成为原始后继节点P3->p2
p1的交换列表节点,通常是exchange节点结构的内容,下一个指针除外。传统的、真实有效的方法是在不交换其他成员的情况下交换节点的关系指针。一个节点有自己的指针和指向下一个节点的指针。“它自己的指针”是上一个节点的下一个指针,所以我们需要交换上一个节点的下一个指针和当前级别的下一个指针。而且,由于头节点和尾节点的关系与中间节点的关系不同,在与头节点和尾节点交换时,需要处理的上、中间节点有细微的区别。所以操作起来比较麻烦,如果关系处理不好,就会出错。另一种方法是交换除下一个指针以外的所有成员。思路非常清晰,就是代码比较长,节点成员多的时候比较明显,编写比较麻烦。有一种确保思路清晰、书写方便的方法是“将需要交换的两个节点作为一个整体交换,然后将下一个指针交换回来”。我工作时经常用这种方法。然而,尽管代码读起来流畅、短视,但你不能指望它能提高效率——因为在切换结构变量时,虽然写得很短,但实际上是一个成员一个成员地交换,更不用说“将下一个指针交换回来”的操作了。个人经验,供参考。
c语言链表冒泡排序 c语言链表添加节点 c语言 链表如何删除指定节点
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。