初始化链栈,为 top 指针申请一节点,申请之后却不用,而将 top 指针指向NULL??求大神指教这个申请节点的操作的作用何在?

只为一世逍遥 2015-08-19 09:44:44
初始化链栈,为 top 指针申请一节点,申请之后却不用,而将 top 指针指向NULL??求大神指教这个申请节点的操作的作用何在?
代码如下:
typedef int Status;
typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */
/* 链栈结构 */
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct
{
LinkStackPtr top;
int count;
}LinkStack;
/* 构造一个空栈S */
Status InitStack(LinkStack *S)
{
//为何此处要申请一个节点?作用何在?申请之后为何不用了?
S->top = (LinkStackPtr)malloc(sizeof(StackNode));
if(!S->top)
return ERROR;
S->top=NULL;
S->count=0;
return OK;
}
我们老师说,应该指向 S->next == NULL;
说如果这样会内存泄露。求助啊
...全文
227 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你们老师的意思是创建一个头节点,然后要它的next指向NULL,而不是它本身指向NULL
假正经的班长 2015-08-19
  • 打赏
  • 举报
回复
引用 2 楼 u010815558 的回复:
[quote=引用 1 楼 cjqpker 的回复:] S->top = (LinkStackPtr)malloc(sizeof(StackNode)); S->top=NULL; 显然发生了内存泄露,刚申请的内存,令 top = NULL 后就找再也不到了,也就没法释放了。 创建一个top表明是头部,令其next指向NULL表明是空链表。虽然top节点可能不存数据,但是要用到其next指针,所以必须创建这个节点
那这个好多都这样写啊,不申请一个空间行么?[/quote] 怎么会好多这样写的? 就算某处要赋值为NULL,那也要free()释放内存之后,再赋值为NULL。 这里如果top不作为节点,只记录第一个节点的地址,也是可以的。那就不要有S->top = (LinkStackPtr)malloc(sizeof(StackNode));这一步操作了。
ForestDB 2015-08-19
  • 打赏
  • 举报
回复
可以搜索研究下带header的链表和不带header的链表。 对特定的链表操作,尝试对两种链表都实现一下,可以发现差别。
只为一世逍遥 2015-08-19
  • 打赏
  • 举报
回复
引用 1 楼 cjqpker 的回复:
S->top = (LinkStackPtr)malloc(sizeof(StackNode)); S->top=NULL; 显然发生了内存泄露,刚申请的内存,令 top = NULL 后就找再也不到了,也就没法释放了。 创建一个top表明是头部,令其next指向NULL表明是空链表。虽然top节点可能不存数据,但是要用到其next指针,所以必须创建这个节点
那这个好多都这样写啊,不申请一个空间行么?
假正经的班长 2015-08-19
  • 打赏
  • 举报
回复
S->top = (LinkStackPtr)malloc(sizeof(StackNode)); S->top=NULL; 显然发生了内存泄露,刚申请的内存,令 top = NULL 后就找再也不到了,也就没法释放了。 创建一个top表明是头部,令其next指向NULL表明是空链表。虽然top节点可能不存数据,但是要用到其next指针,所以必须创建这个节点
xian_wwq 2015-08-19
  • 打赏
  • 举报
回复
malloc的对象,不用的时候肯定要free
只为一世逍遥 2015-08-19
  • 打赏
  • 举报
回复
引用 4 楼 cjqpker 的回复:
[quote=引用 2 楼 u010815558 的回复:] [quote=引用 1 楼 cjqpker 的回复:] S->top = (LinkStackPtr)malloc(sizeof(StackNode)); S->top=NULL; 显然发生了内存泄露,刚申请的内存,令 top = NULL 后就找再也不到了,也就没法释放了。 创建一个top表明是头部,令其next指向NULL表明是空链表。虽然top节点可能不存数据,但是要用到其next指针,所以必须创建这个节点
那这个好多都这样写啊,不申请一个空间行么?[/quote] 怎么会好多这样写的? 就算某处要赋值为NULL,那也要free()释放内存之后,再赋值为NULL。 这里如果top不作为节点,只记录第一个节点的地址,也是可以的。那就不要有S->top = (LinkStackPtr)malloc(sizeof(StackNode));这一步操作了。[/quote]偶偶,谢谢了
只为一世逍遥 2015-08-19
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
可以搜索研究下带header的链表和不带header的链表。 对特定的链表操作,尝试对两种链表都实现一下,可以发现差别。
好的,谢谢了

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧