C链表只包含第一个元素......不确定休息会发生什么

时间:2010-01-23 04:26:49

标签: c linked-list

前几天我在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。

任何人都有任何关于我做错的线索吗?

4 个答案:

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