关于双向链表插入节点的问题
来源:互联网 发布:双系统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;
{
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函数,就好比表头在堆区里面放着,然后第一个节点在栈区,以后开辟的节点也就是第一节点的地址。
- 关于双向链表插入节点的问题
- 关于c双向链表的插入问题
- 双向链表 删除节点 插入节点
- 双向链表的建立、删除/插入节点
- 双向链表的插入与删除节点
- 嵌入式 双向链表节点的删除的问题
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- java建立双向链表,插入结点,删除节点
- 双向链表(1) - 基本介绍以及插入节点
- 关于双向链表之插入+删除
- C语言实现双向非循环链表(不带头结点)的节点插入
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- 实现双向链表删除一个节点P,在节点P后插入一个节点
- 双向链表的建立,添加节点和删除节点(注意插入和删除要分三种情况)
- 双向链表的初始化,建立,添加节点和删除节点(注意插入和删除要分三种情况)
- 双向链表的查找节点。
- 双向链表的节点删除
- 双向循环链表的插入
- nodejs 全局环境变量配饰 win7
- 简要介绍.exe、.com和.bat文件
- Java虚拟机学习随笔(三)
- PHP+Apache+MySQL经典搭配,创建环境四 phpMyAdmin安装(转载并修改)
- python简明教程学习笔记3--模块
- 关于双向链表插入节点的问题
- 请问在sqlmap怎样写转码
- Android常见基础知识
- 系统震动服务
- 计算机科学中最重要的32个算法
- BW总体存储管理规范
- win7 下安装oracle
- IT职场人生系列之十二:语言与技术I
- 吃了单片机GPIO端口工作模式的大亏——关于强推挽输出和准双向口(弱上拉)的实际应用