c语言中链表如何交换节点?

2025-03-07 09:09:48
推荐回答(2个)
回答1:

链表交换节点有两种方式:

  1. 交换结点内容

  2. 交换结点位置

如定义以下结构体,分为数据部分和链表指针部分

struct _data {
    int num;
    float score;
} ;
struct stu
{
    struct _data data;
    struct stu *next;
}*head, *p1,*p2,*p3,*p4;
head->p1->p2->p3->p4 ;

交换结点内容,结点顺序不变,依然保持原样,则交换两个结点时,只交换数据部分,next指针不要动,如:交换p1和p3的内容(数据):

struct _data t=p1->data;p1->data=p3->data;p3->data=t ;//这样就可以了。

交换结点位置,链表的顺序会发生变化,为保持链表的正常衔接,则要重新设置next的值,过程略有复杂,如:交换p1,p3的位置:最终变成:head->p3->p2->p1->p4 ;

首先,要找到p1的原前趋结点head,和p3的前趋结点p2
然后,开始重新分配链表的排列:
1、p1的原前趋结点(head)的新后继结点  要变成p3
2、p1的新后继结点要变成p3的原后继结点(p4)
3、p3的原前趋结点(p2)的新后继结点 要变成p1
4、p3的新后继结点要变成p1的原后继结点(p2)

struct stu *p1p, *p3p, *p;
for( p=head;p!=NULL;p=p->next )
{
    if ( p->next==p1 )
        p1p=p; //找到p1的前趋head
    if ( p->next==p3 )
        p3p=p;//找到p3的前趋p2
}
p1p->next=p3;//p1的原前趋结点 的 新后继结点 变成p3       head->p3
struct stu *tNext=p1->next ; //保存p1的原后继结点(p2)
p1->next=p3->next; //p1的新后继结点要变成p3的原后继结点(p4) p1->p4
p3p->next=p1; //p3的原前趋结点 的 新后继结点 变成p1      p2->p1
p3->next=tNext ; //p3的新后继结点 变成p1的原后继结点     p3->p2

回答2:

粗粗看了下,这里有个错误:

temp->num=p1->num;
p1->num=p2->num;
p2->num=temp->num;
temp->score=p1->score;
p1->score=p2->score;
p2->score=temp->score;

temp是指针,未初始化申请内存的情况下直接使用会有问题,容易引起程序崩溃

建议改为:定义:

struct stu temp;

使用交换:

temp.num=p1->num;
p1->num=p2->num;
p2->num=temp.num;
temp.score=p1->score;
p1->score=p2->score;
p2->score=temp.score;