【发布时间】:2014-08-17 11:50:36
【问题描述】:
#include <iostream>
using namespace std;
typedef struct node NODE;
struct node{
int value;
NODE *next;
};
void addNode(NODE *prev)
{
NODE* next=(NODE*)malloc(sizeof(NODE));
int value;
cin>>value;
next->value=value;
while(prev->next!=NULL)
{
prev=prev->next;
}
prev->next=next;
next->next=NULL;
}
int main()
{
int ch;
NODE* curr=(NODE*)malloc(sizeof(NODE));
NODE* trav;//=(NODE*)malloc(sizeof(NODE));
trav=curr;
curr->value=10;
curr->next=NULL;
while(true)
{
cin>>ch;
switch(ch)
{
case 1:
{
addNode(trav);
//trav=next;
break;
}
case 2:
{
trav=curr;
while(trav!=NULL)
{
cout<<trav->value<<endl;
trav=trav->next;
}
break;
}
case -1:{break;}
}
if(ch==-1)break;
}
free(curr);
free(trav);
}
我试图实现链表数据结构。上面的代码运行良好,但是,我不明白一件事。我什至没有创建结构节点的单个实例,它们都是简单的指针,我在堆上为这些指针分配内存。节点实际存储在哪里,因为根据我的说法,指针只存储地址而没有其他内容。就像我使用 next->value 时一样,该值存储在哪里? 通常我都是这样使用指针的。
int a;
int *p;
p=&a;
现在,我知道在内存中的某个点有一个存储的并且 p 指向那个位置。然而,在这些节点结构中,没有真正的实例,只是在堆上分配内存。
它是如何工作的?
【问题讨论】:
-
嗯?您在所有
malloc行上创建节点实例。节点的存储在您 malloc'd 的内存中。 -
当它是 C++ 时为什么要标记 C?为什么在使用 C++ 时使用
malloc -
在 C++ 中你可以避免 malloc 使用 new 和 free 和 delete。
-
@pqnet:其实是C++:这是一个需要被符合标准的C++编译器接受的程序。它肯定不是好 C++。
-
使用
malloc/free是它的问题之一,是的。这些函数是为了与 C 兼容,不应在纯 C++ 代码中使用。另一个问题是您在使用它们时没有包含适当的标头(iostream不需要间接包含该标头;当我声称需要编译代码时,我没有注意到该问题,实际上是由于该问题't)。此外,typedef struct node NODE在 C++ 中没有任何意义;由于定义为struct node的类型可以引用为node,因此typedef 只是添加了一个多余的名称而不需要。
标签: c++ pointers data-structures struct