能给一个详细一点的注释吗?C语言的

img

img

![img]( https://img-mid.csdnimg.cn/release/static/image/mid/ask/111730754036150.png 'VTDUQ1%`@ZE00[F_11[IYCA.png'刚入门有点看不懂链表,希望能帮个忙,有重赏
谢谢各位
指针的用法也有点看不懂
希望各位可以给点详细一点的注释

你原有的函数结构有个错误的地方,已经给你修改过来了。请采纳

Node* queryDiffer(Node** p1, Node** p2)//定义了一个函数,其返回值是Node的指针,两个形参是Node的指针的指针p1和p2(也就是两个链表)
{
    if (*p1 == NULL) //如果p1是空指针(空链表)
        return p2;//直接返回p2
    if (*p2 == NULL)//如果p2是空指针(空链表)
        return p1;//直接返回p1
    Node* p = NULL;//声明一个Node的指针p
    Node* pi = NULL;//声明一个Node的指针pi
    Node* pj = NULL;//声明一个Node的指针pj
    for (pi = *p1; pi!= NULL; pi=pi->_pNext)//通过pi对链表p1进行节点(Node)遍历
    {
        int isIn = 0;//声明一个整形isIn为0
        for ( pj= *p2; pj!=NULL; pj=pj->_pNext)//通过pj对链表p2进行节点遍历
        {
            if (pi->_data==pj->_data)//如果p1某个节点的data值,和p2某个节点的data相等
            {
                isIn = 1;//则isIn赋值为1
            }

        }
        if (isLn == 0)//如果经过pj对p2所有节点的遍历后isIn为0,说明当前p1节点的data值,和p2中所有节点的data值不等(即p1的该节点data值不在p2中存在,即不用被差运算除去)
        {
            ListPushBack(&p, pi->_data);//那么调用ListPusbBack函数,传入当前p1节点的data值,以更新差运算结果
        }
    }
    return p;//返回差运算的结果
}

果然有重赏
AUB过程(就是求两个链表的合集,去掉重复元素):
1、检查需要求合集的两个链表是否有空的,如果有一个为空,则返回另一个。这个明白吧? 等于是任何数加0结果都为任何数
2、将第一个链表所有元素先复制到合并链表中(第一个for循环)
3、遍历第二个链表所有元素,如果该元素在合并列表中,则忽略,如果不在,则将该元素加入合并列表。对每个元素在合并链表中进行比较,如果有,则标志变量isIn设置为1,这里其实在isIn = 1时可以直接break的,没有必要继续循环了
4、最后返回合并链表p

A-B过程(就是在A链表中去掉B链表中存在的重复元素):
1、与AUB的第一步一样
2、遍历A链表,比较其元素是否在B链表中存在,存在则标志变量isIn设置为1。如果B链表中不存在,则将该元素加入差链表p
3、返回p

链表看注释不一定看得懂,自己画一个链表的结构,对比着代码一步步变化,很容易的。

  1. 并集(两个合并,即A∪B)、交集(两个集合的共同的部分,即A∩B)、差集(两个集合的差,即A-B)。
  2. 所以并运算的代码部分的逻辑就是,先遍历A集合,先把A放入到链表中,然后遍历B,将B的data域的值与已经存放了A的链表的data域的值进行比较,如果没有(isIn=0)添加,增将B加入到链表中。否则就不添加。
  3. 差运算和交运算代码逻辑类似。

以并集运算为例,详细注释如下:

Node* queryUnion(Node** p1, Node** p2)
{
    //这两行代码的作用,就是确保p1和p2都不为空。如果有一个为空,则返回另外一个(一个集合与空集的并集为这个集合本身)。
    if (*p1 == NULL)
        return p2; //如果p1指针是空指针,则返回p2

    if (*p2 == NULL)
        return p1; //如果p2指针是空指针,则返回p1

    Node* p = NULL;  //存放并运算之后,最终结果的指针
    Node* pi = NULL; //指向p1的指针,作用是可以遍历p1
    Node* pj = NULL; //指向p2的指针,作用是可以遍历p2

    //将p1头指针赋值给pi,pi就可以遍历p1指针
    for (pi = *p1; pi != NULL; pi = pi->_pNext)
    {
        int isIn = 0;//标志位,表示p中是否已经有了当前元素

        //将p2头指针赋值给pi,pj就可以遍历p2指针
        for (pj = *p2; pj != NULL; pj = pj->_pNext)
        {
            if (pi->_data == pj->_data) //比较p1和p2(pi和pj各种指向p1和p2,就代表了p1和p2)的值,如果相同,则说明已经添加过,就不需要添加
            {
                isIn = 1; //标志位,为1说明已经有了,此时不需要添加
            }
        }
        if (isIn == 0) //判断标志位,为0说明还没有,此时可以添加到p里面
        {
            ListPushBack(&p, pi->_data); //ListPushBack是另外一个方法,此时添加到p里面
        }
    }
    return p; //返回p,p就是p1和p2的并集
}