链表中的相邻节点交换但在输出 1 节点丢失

Adjacent node swap in linked list but at output 1 node is missing

这是我为单向链表中的节点交换编写的函数。 还有其他功能 append , delete , length 等。 现在,当执行 nodeswap 时,左节点会丢失。 例如..... 链表是 1->2->3 交换后它变成 1->3

void nodeswap()
{ 
    struct node *p,*q,*r;
    int i=1,loc,l;
    l=len();
    printf("At what position you want to swap nodes?\n");
    scanf("%d",&loc);
    if(loc>l)
    {
        printf("Swap not possible , no nodes beyond the location\n");
    }
    else
    {
        p=root;
        while(i<loc-1)
        {
            p=p->link;
            i++;
        }

        //access nodes
        q=p->link;
        r=q->link;
    }

        //swap
        //p,q,r
        //p,r,q
        q=r->link;
        r->link=q;
        p->link=r;


}

问题出在这一行q=r->link; 您需要将其更改为 q->link = r->link

例如,如果你的链表中有以下四个节点,以及相应的指针

A->B->C->D
p  q  r

当您执行 q=r->link; 时,这只是将设置更改为

A->B->C->D
p     r  q

显然这不是你想要的,你想将 q 的下一个节点设置为 D,为此执行 q->link = r->link