一切尽在code中:

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

/*测试通过二级指针删除链表元素*/

struct TEST {
    struct TEST *next;
    int a;
};

struct TEST *h;

static int add_list(struct TEST *test)
{
    if (test == NULL)
        return -1;
    test->next = h;
    h = test;

    return 0;
}


int main(int argc, char *argv[])
{
    struct TEST **tmp;
    struct TEST test_1, test_2, test_3;

    test_1.a = 1;
    test_2.a = 2;
    test_3.a = 3;

    add_list(&test_1);
#if 0
    add_list(&test_2);
    add_list(&test_3);
#endif

    /*二级指针相对于指针具有相同的访问能力*/
    /*
     * 刚开始时候判断了*tmp不为NULL,所以 (*tmp)->next 一定是存在的
     * 此处操作没什么问题
     */
    for (tmp = &h; *tmp; tmp = &(*tmp)->next) {
        printf("%d ", (*tmp)->a);
    }
    printf("\n");

    /*二级指针相对于指针,增加了修改指针变量的能力*/
    for (tmp = &h; *tmp != NULL; tmp = &(*tmp)->next) {
        if ((*tmp)->a == 1) {
            /*
             * 由于此处的删除操作,导致此时(*tmp)可能为NULL了。
             * 执行:
             *         tmp=&(*tmp)->next
             * 时候不会出现问题,执行具体的
             *        *tmp != NULL
             * 操作时候会报段错误
             *
             * 所以代码应该添加*tmp!=NULL判断
             */
            *tmp = (*tmp)->next;
#if 1   //added begin
            if (*tmp == NULL)
                break;
#endif  //added
        }
    }
    printf("\n");

    for (tmp = &h; *tmp; tmp = &(*tmp)->next) {
        printf("%d ", (*tmp)->a);
    }
    printf("\n");

    return 0;
}

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄