void add ( struct node **q, int num )
{
struct node *temp ;
/* add new node */
temp = ( struct node * ) malloc ( sizeof ( struct node ) ) ;
temp -> data = num ;
temp -> link = *q ;
*q = temp ;
}此函数用于在列表开头添加一个新项。
我怀疑,在大多数书籍中,涉及链接列表的函数函数使用指向节点结构的指针,而不是结构本身的实例。
void add( struct node *q, int num )
{
struct node temp ;
temp.data = num ;
temp.link = q ;
q = &temp ;
} 是否有理由选择第一种形式的函数,还是这两种方法都一样好?
发布于 2014-06-28 09:01:02
第二种方法是完全错误的。它什么都不做。当程序进入功能体时创建节点,并在离开该函数体时消失,因为它不是动态分配的,而对p的更改不会反映到在调用函数中传递的指针。
发布于 2014-06-28 09:45:57
第二个例子是完全错误的。
所以你错了,也是这个问题的一个例子。
下面的示例可能有效。
void add( struct node **q, int num){
static int count = 0;
static struct node pool[1024];
if(count == 1024){
fprintf(stderr, "Sold out!\n");
} else {
pool[count].data = num;
pool[count].link = *q;
*q = &pool[count];
++count;
}
}为节点使用指针和动态分配内存的原因之一是由于存在期。
如果您创建一个生存期节点,例如全局变量和静态内存,则可以使用它。
此外,它甚至可以用于自动变量,如struct node temp;。当在函数中创建列表并对其本地时,可以使用它,如下所示:
#include <stdio.h>
struct node {
int data;
struct node *link;
};
void add( struct node *q, int num){
if(num == 10){
for( ; q ; q = q->link)
printf("%d ", q->data);
printf("\n");
} else {
struct node temp;
temp.data = num;
temp.link = q;
add(&temp, num + 1);
}
}
int main(){
add(NULL, 0);
return 0;
}https://stackoverflow.com/questions/24465226
复制相似问题