学生党,有没有耐心的看一下,为什么每次从 Initlist_L 函数出来之后 l 的内存都会被释放,导致遍历函数出错?

typedef int ElemType;





typedef struct Node{       
    ElemType data;        
    struct Node* next;     
}Node,*LinkList;      


int main(int argc, const char * argv[]) {
    LinkList l = NULL;
    
    if( !Initlist_L( l ) ){
        PrintList_L( l );      //遍历链表元素
    }else {
        printf( "分配内存失败." );
    }
}

int Initlist_L( LinkList l ){      //创建链表并初始化
    int a,b;
    int c = 0;
    Node* p,*q = NULL;
    l = (LinkList)malloc(sizeof(Node));
    l->next = NULL;               //创建头结点
    if( !l ){
        return -1;
    }
    printf( "是否输入数据?Yes:1;No: 0" );
    scanf( "%d",&a );
    while( a ){
        if( !(c++) ){
        p = (Node*)malloc(sizeof(Node));
        printf( "请输入数据:");
        scanf( "%d",&b );
        p->data = b;
        p->next = l->next;
        l->next = p;
        q = p;
        }else {
            p = (Node*)malloc(sizeof(Node));
            printf( "请输入数据:");
            scanf( "%d",&b );
            p->data = b;
            q->next = p;
            p->next = NULL;
            q = p;
        }
        printf( "是否继续输入数据?Yes: 1; No: 0");
        scanf( "%d",&a );

    }
    printf( "\n" );
    return 0;
};      


函数:int Initlist_L(LinkList &l) 形参加上地址引用即可 。
第58行:}; 多了 ‘ ; '号

img
这里应该是c++,不用!吧?

那就这么改下:

int Initlist_L(LinkList *l) {      //创建链表并初始化
    int a, b;
    int c = 0;
    Node* p, * q = NULL;
    (*l) = (LinkList)malloc(sizeof(Node));
    (*l)->next = NULL;               //创建头结点
    if (!(*l)) {
        return -1;
    }
    printf("是否输入数据(Yes:1;No: 0)? ");
    scanf("%d", &a);
    while (a) {
        if (!(c++)) {
            p = (Node*)malloc(sizeof(Node));
            printf("请输入数据:");
            scanf("%d", &b);
            p->data = b;
            p->next = (*l)->next;
            (*l)->next = p;
            q = p;
        }
        else {
            p = (Node*)malloc(sizeof(Node));
            printf("请输入数据:");
            scanf("%d", &b);
            p->data = b;
            q->next = p;
            p->next = NULL;
            q = p;
        }
        printf("是否输入数据(Yes:1;No: 0)? ");
        scanf("%d", &a);
    }
    printf("\n");
    return 0;
}//;

主函数:

int main(int argc, const char* argv[]) {
    LinkList l = NULL;
    if (!Initlist_L(&l)) {
        PrintList_L(l);      //遍历链表元素
    }
    else {
        printf("分配内存失败.");
    }
    return 0;
}