关于双向链表插入节点的问题

来源:互联网 发布:双系统ubuntu引导恢复 编辑:程序博客网 时间:2024/05/14 05:27
Status ListInsert(DuLinkList L, int i, ElemType e)
{
        DuLinkList p;
        DuLNode *s; //定义一个链表节点指针
        if (i < 1 || i > ListLength(L) + 1)
                return ERROR;
        p = GetElemP(L, i-1);//得到位置i-1处节点的地址
        s -> data = e;
        s -> next = p -> next;
        p -> next -> prior = s;
        p -> next = s;
        s -> prior = p;
        return OK; 

}

这样写出来的函数可以成功对双向链表进行插入嘛?需要对s使用malloc函数进行开辟空间吗?
 其实我以前一直不明白,定义了一个DuLNode*s,指针,那么它本身就有存放的地址,为什么还要再开辟空间 s=(LinkList)malloc(sizeof(LNode)),将开辟空间的地址给他。

经过调试发现,DuLNode *s定义的指针,地址为0x8049a7c(这个地址在栈里面),L地址为0x804a008(这个地址在堆里面)。
 插入第一个节点,发现没问题,ListInsert函数返回时,0x8048a7c也可以访问,里面放的data也是1,可是第二 次再调用的时候,又定义了一个DuLNode *s,栈的地址在第一次返回时相当于已经收回,这次调用该函数,系统认为那个地址没用了,可以继续申请,所以申请的地址还是0x8049a7c(每次编译时候该地址会变,但是,和第一次调用ListInsert函数时候地址是一样的),再向该data里面写入数据时,就会把第一次写的数据覆盖也就是说,这个链表每次插入就都只有两个节点,以后定义的s也都是0x8049a7c这个地址。
                所以,要使用malloc这个函数,他调用后,会在堆区申请块空间,改空间跟栈不同,不会在函数调用返回后释放,直到free函数,才会释放这个空间。 那么每次调用插入函数,都会在堆区申请一个空间,那么最后链表也在堆区里面放着。如果像前面那样,不用malloc函数,就好比表头在堆区里面放着,然后第一个节点在栈区,以后开辟的节点也就是第一节点的地址。

原创粉丝点击