前几天我在C中发布了一个关于链接列表的问题。我认为一切都还可以,然后教授给我们发电子邮件说不是这个签名:
int insert_intlist( INTLIST* lst, int n); /* Inserts an int (n) into an intlist from the beginning*/
他不小心意味着:
int insert_intlist( INTLIST** lst, int n); /* Inserts an int (n) into an intlist from the beginning*/
我觉得自己很酷,我有一个指向指针的指针我可以将指针移到main之外,当我返回main时,我仍然会有完整的链表。
他开始给我们这个:
INTLIST* init_intlist( int n )
{
INTLIST *lst; //pointer to store node
lst = (INTLIST *)malloc(sizeof(INTLIST)); //create enough memory for the node
lst->datum = n; //set the value
lst->next = NULL; //set the pointer
return lst; //return the new list
}
这只是在main中初始化列表:
if (lst==NULL)
lst = init_intlist(i);
else
insert_intlist(lst, i);
lst的类型为INTLIST *,因此定义为INTLIST * lst。所以我从一个文本文件中读取了一些数字,如1 3 4 9。 它应该从这个创建链接列表...所以第一个数字将转到init_intlist(1);这是上面定义的。然后它在这种情况下抓取下一个数字3并调用insert_intlist(lst,3)。那么这是我的insert_intlist,我想要做的就是在列表的开头插入:
int insert_intlist(INTLIST** lst, int n )
{
INTLIST* lstTemp; //pointer to store temporary node to be added to linked list
lstTemp = (INTLIST *)malloc(sizeof(INTLIST)); //create enough memory for the node
lstTemp->datum = n; //assign the value
//check if there is anything in the list,
//there should be, but just in case
if(*lst == NULL)
{
*lst=lstTemp;
lstTemp->next=NULL;
}
else
{
lstTemp->next = *lst; //attach new node to the front
*lst = lstTemp; //incoming new node becomes the head of the list
}
return 0;
}
因此,如果列表最初包含1,则此函数将只创建一个新节点,然后将此临时节点 - >接下来指向列表的头部(我认为是lst),然后重新分配列表的头部到这个新的临时节点。
一切看起来都在正常运行,但当我尝试将我的列表打印到屏幕时,它只打印数字1。
任何人都有任何关于我做错的线索吗?
答案 0 :(得分:1)
您正在传递指向指针的指针。您想要更改指向的指针,而不是指向指针本身的指针。这有意义吗?
if(lst == NULL)
在这里,您要检查是否传递了NULL指针。错误检查的好习惯,但不是你在那里做的事情。如果lst
为NULL,那么你甚至没有指向指针的指针,也无法执行任何操作,并且应该返回非零错误代码而不执行任何其他操作。
一旦你确定你的指针不是NULL,那么然后你会看到它指向的指针(*lst
)。指向指针是指向第一个列表项的指针。如果 指针为NULL,则然后将其更改为新项目的指针。基本上,您使用lst
的位置应该使用*lst
或(*lst)
。 (记住:*
运算符在 ->
运算符之后运行!所以要在lst
指向的指针指向的对象中获取一个字段[裤子,喘气],你使用(*lst)->whatever
。)
P.S。这种指针工作是 critical ,以学习成为一名优秀的程序员,尤其是使用C语言。
P.P.S。你错了的另一件事是,而不是
insert_intlist(lst, i);
你应该把它称为
insert_intlist(&lst, i);
...而且,对于布朗尼点,请检查错误的返回码。
答案 1 :(得分:0)
我想到的第一个问题是insert_intlist()
你正在做lst = lstTemp;
。这应该是*lst = lstTemp;
。这样就可以分配给你提供的列表指针而不是列表指针指针(它不会更新函数之外的任何内容)。
答案 2 :(得分:0)
由于您在插入函数中使用指向另一个指针的指针,因此您可以更改后者实际指向的内存位置。我稍微更改了插入代码,它工作正常:
int insert_intlist(INTLIST** lst, int n )
{
INTLIST* lstTemp; //pointer to store temporary node to be added to linked list
lstTemp = (INTLIST *)malloc(sizeof(INTLIST)); //create enough memory for the node
lstTemp->datum = n; //assign the value
//check if there is anything in the list,
//there should be, but just in case
if(*lst == NULL)
{
lstTemp->next=NULL;
*lst = lstTemp;
}
else
{
lstTemp->next = *lst; //attach new node to the front
*lst = lstTemp; //incoming new node becomes the head of the list
}
return 0;
}
编辑:我看到你编辑了你的问题。在这种情况下,也许你在main()中以错误的方式调用insert函数。试试这个int main()
{
INTLIST *head;
head = init_intlist(42);
insert_intlist(&head, 41);
display(head);
return 0;
}
答案 3 :(得分:0)
在lstTemp-> next = lst之后检查lstTemp-> next == NULL