关于头结点和头指针的学习问题


#include <stdio.h>
#include <stdlib.h>

typedef struct l
{
    int value;
    struct l* next;
 }Link;
 
//////////判空 
int Empty(const Link* Head)
{
    if(Head->next==NULL)return 0;
    else return 1;
}
//////////删除第i个节点
void Delete(Link *Head,int i)
{
    Link *q=Head;
    while(--i)//i=1时不执行,即q=Head;
    {
        q=q->next;
    }
    q->next=q->next->next;
}
/////////在第i个节点前插入 节点K 
void Insert(Link *Head,int i,Link *K)
{
    Link *q=Head;    
    while(--i)//i=1时不执行,即q=Head; 
    {
        q=q->next;
    }
    q->next=K;
    K->next=q->next;
}

关于链表的头结点作用问题,普遍共识是:
方便在第1个位置进行插入、删除操作时同其他位置一样。加了头结点之后,插入、删除都是在后继指针next上进行操作,不用动头指针;若不加头指针的话,在第1个位置插入或者删除第1个元素时,需要动的是头指针。
但是自己尝试性写了一下,发现似乎并不是这样,感觉似乎不设头结点也不用对第一个节点的插入和删除额外处理。我感觉应该是出了问题,但是自己一时没想明白哪里出了问题,望指正

可以参考下我的代码
https://blog.csdn.net/weixin_44001521/article/details/120623891

然后题主的问题很明显

例如这个函数内,
void Insert(Link *Head,int i,Link *K)
{
    Link *q=Head;    
    while(--i)//i=1时不执行,即q=Head; 
    {
        q=q->next;
    }
    q->next=K;
    K->next=q->next; (这个要和上面一句换位置)
}

头节点h,第一个节点p,第二个q
有头节点
插入r r->next=p; h->next=r
删除p h->next=p-next

无头节点
插入r r->next=p; p=r
删除p p=q-next

如果p,q在中间
在q位置插入r r->next=q; p->next=r
删除q p-next=q-next