关于线性表创建的,其中初始化,有个NULL

C语言 码拜 8年前 (2016-04-05) 1051次浏览
#include <stdio.h>
#include <stdlib.h>
typedef struct SeqList{
	char data;
	struct SeqList *next;
}SeqList;
int InitList(SeqList *l)
{
	l=(SeqList *)malloc(sizeof(SeqList));
	if(l!=NULL)
	{
		l->next=NULL;
		return 1;
	}
	return 0;
}
void CreatList(SeqList *l)
{
	if(l->next==NULL)
		printf("yes\n");
}
int main()
{
	SeqList l;
	InitList(&l);
	CreatList(&l);
	return 0;
}

只想问,为什么打印不出来yes

解决方案

20

int InitList(SeqList *l)
{
    l=(SeqList *)malloc(sizeof(SeqList));

最后一句是修改这个参数本身,而不是传递过来的参数,可以试试

int InitList(SeqList *l)
{
    l->next =(SeqList *)malloc(sizeof(SeqList));

20

#include <stdio.h>
#include <stdlib.h>
typedef struct SeqList{
char data;
struct SeqList *next;
}SeqList;
int InitList(SeqList **l)
{
*l=(SeqList *)malloc(sizeof(SeqList));
if(l!=NULL)
{
(*l)->next=NULL;
return 1;
}
return 0;
}
void CreatList(SeqList *l)
{
if(l->next==NULL)
printf(“yes\n”);
}
int main()
{
SeqList *l;
InitList(&l);
CreatList(l);
return 0;
}

50

lz犯了一个错误, 参数的传递只是传递一个副本,对于InitList来说, SeqList *l 这个只是 main 那个 l 的副本, 所以调用InitList后, main中的那个l, 并没有改变。由于在初始化时, l 的内容可能被初始化为0xcccccccc, 所以createLIst中打印不出来yes. 这样改

int InitList(SeqList **l)
{
    (*l)=(SeqList *)malloc(sizeof(SeqList));
    if((*l)!=NULL)
    {
        (*l)->next=NULL;
        return 1;
    }
    return 0;
}
void CreatList(SeqList *l)
{
    if(l->next==NULL)
        printf("yes\n");
}
 
int main()
{
    SeqList *l;
    InitList(&l);
    CreatList(l);
    return 0;
}

P.S. 不要单字母命名变量, 特别是用l
///

20

要通过InitList函数来修改main函数里的l的指向
必须传二级指针或一级指针的引用,光传一级指针是没有用的(一级指针指向修改指针所指向的区域)
(原因是main函数的l和InitList函数的形参l他们仅仅是指向同一块内存区域,
但两者本身并不是同一个指针,所以你对InitList函数的l进行操作是影响不到main函数的l的)

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于线性表创建的,其中初始化,有个NULL
喜欢 (0)
[1034331897@qq.com]
分享 (0)