【问题标题】:Do we not need to create actual nodes while creating a linked list?我们在创建链表时不需要创建实际节点吗?
【发布时间】:2014-09-22 02:49:30
【问题描述】:

我正在研究来自this article.的链表

本教程的作者从不创建实际的节点,而只创建节点类型的指针变量,如下代码所示...

struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;

然后他在堆中为它们分配空间......

head = (struct node*)malloc(sizeof(struct node)); 
second = (struct node*)malloc(sizeof(struct node));
third = (struct node*)malloc(sizeof(struct node));

他为什么不创建实际的节点?代码应该看起来像这样......

struct node head;
struct node second;
struct node third;

如果我的知识是正确的(如果我错了,请纠正我)。简单地声明指针变量并不会创建实际的变量(链表的情况下是节点),因此不能像文章中的教程作者那样使用代码取消引用

head->data = 1;

我的意思是,如果这行得通,那为什么这行不通?

int *a;
a=5;
printf("%d",*a);

显然,上面的代码没有输出 5。

这意味着需要创建另一个变量,然后需要说明该变量的地址存储在一个指针变量中,然后才能取消引用...就像下面的代码...

int *a;
int b=5;
a=&b;
printf("%d",*a);

这会输出 5。

那么作者是如何避免创建节点的呢?他只是简单地创建指针变量,然后简单地取消引用它们......

【问题讨论】:

  • struct node *node = malloc(sizeof(*node)) 绝对是“创造”它。
  • 关于指针(而不仅仅是节点)的全部要点是,如果您的头节点固定在堆栈上,您将无法安全地添加新元素。
  • 好吧,你试着取出malloc,看看你能走多远。那些是节点。你应该看看 malloc 做了什么。

标签: c pointers data-structures struct linked-list


【解决方案1】:

节点在堆中,这就是malloc 的用途。

用没有链表的代码来解释,类似:

int *a = NULL;
a = malloc(sizeof(int));
*a = 5;
printf("%d",*a);

【讨论】:

    【解决方案2】:

    创建结构指针是为了让它们可以引用地址。由于普通的结构变量不能存储地址,所以这种语法是错误的。 struct node head; struct node second; struct node third;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 2020-12-22
      • 2013-08-26
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多