如果我在main中初始化列表,它就像魅力一样,但我无法添加到空列表中。为什么不呢?
#include "stdio.h"
#include "stdlib.h"
struct liste{
int a;
struct liste *next;
};
void AddEnd( int val, struct liste* l )
{
struct liste *aux;
struct liste *n;
n=(struct liste*) malloc (sizeof(struct liste));
n->a = val;
n->next = NULL;
aux=l;
if(aux == NULL)
{
l=n;
}
else
{
while(aux->next != NULL)
aux=aux->next;
aux->next=n;
}
}
void DeleteHead(struct liste* l){
struct liste *aux=l;
if (aux!=NULL)
{
l=l->next;
free(aux);
}
}
void Print ( struct liste* l)
{
printf("the list contains: \n ");
while(l!=NULL)
{
printf("%d | ",l->a);
l = l->next;
}
}
void main() {
struct liste* nl;
AddEnd(9,nl);
AddEnd(8,nl);
AddEnd(7,nl);
DeleteHead(nl);
Print(nl);
}
答案 0 :(得分:0)
您应该使用指向指针的指针来修改“AddEnd”函数中的“nl”:
void AddEnd( int val, struct liste** l )
{
struct liste *aux;
struct liste *n;
n=(struct liste*) malloc (sizeof(struct liste));
n->a = val;
n->next = NULL;
aux=*l;
if(aux == NULL)
{
*l=n;
}
else
{
while(aux->next != NULL)
aux=aux->next;
aux->next=n;
}
}
还需要这样的改变:
void main() {
struct liste* nl = NULL;
AddEnd(9, &nl);
答案 1 :(得分:0)
在函数参数中,l是函数的局部变量。因此,函数中此变量的任何更改都不会影响原始参数。
按以下方式更改功能
void AddEnd( int val, struct liste **l )
{
struct liste *n = (struct liste*) malloc( sizeof( struct liste ) );
n->a = val;
n->next = NULL;
if ( *l == NULL )
{
*l = n;
}
else
{
struct liste *aux = *l;
while ( aux->next != NULL ) aux = aux->next;
aux->next = n;
}
}
另外在主要内容中,您首先删除列表,然后尝试打印它。我认为你的意思是
int main( void ) {
struct liste* nl;
AddEnd( 9, &nl );
AddEnd( 8, &nl );
AddEnd( 7, &nl );
Print(nl);
DeleteHead(nl);
}
还要考虑到C中的main应声明为
int main( void )
答案 2 :(得分:0)
由于c中的参数通过值传递,因此在struct liste * l上完成的更改未反映在main函数中。 从AddEnd函数返回指向列表头部的指针,即
struct liste * AddEnd( int val, struct liste* l )
{
.....
if(aux == NULL)
{
*l=n;
}
else
{
while(aux->next != NULL)
aux=aux->next;
aux->next=n;
}
return l;
然后在主要功能
nl = AddEnd(nl);
将指针传递到列表的头部