在C中构造指针链表

时间:2014-02-03 18:27:00

标签: c list pointers struct

如果我在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);

}

3 个答案:

答案 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);

将指针传递到列表的头部