c中的链接列表,代码行的解释?

时间:2013-11-12 18:29:18

标签: c list pointers linked-list

我刚开始学习c中的链表。我仍然在代码中混淆了第1行。 1.什么是temp->数据,它是指针吗?变量? 2.什么是temp-> next = head,这里head有NULL值????如果是这样,temp-> next现在变为NULL ??? 真的搞砸了这条线,请帮帮我。感谢

#include <stdio.h>
#include <stdlib.h>

struct test_struct{
    int data;
    struct test_struct *next;
};

struct test_struct* head=NULL;

int main()
{

    head = NULL;
    struct test_struct* temp = (struct test_struct*)malloc(sizeof(struct test_struct));
    if(NULL==temp)
    {
        printf("error in memory");
        return 0;
    }
    temp->data=5;    // line  1      <----------  what's going on
    temp->next=head; // line 2       <----------  what's going on here?
    head=temp;
    printf("%p\n",head);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

  

什么是temp-&gt;数据,它是指针吗?变量?

好吧,让我们分解一下:

  1. 什么是临时?它被声明为

    struct test_struct* temp = ...
    

    所以我们知道它是指向struct test_struct的指针。

  2. 什么是temp->data?这意味着跟随(取消引用)指针,并获得名为data 的成员。您的test_struct声明为

    struct test_struct {
      int data;
      struct test_struct *next;
    };
    

    所以,我们知道它有一个名为data的整数成员。 temp->data是对该整数的引用。


  3.   

    什么是temp-&gt; next = head,这里head有NULL值????如果是这样,temp-&gt; next现在变为NULL ???

    此代码 NULL指定给指针temp->next

    如果您对这些内容感到困惑,那么学习在调试器中逐步完成它可能会有所帮助(就像一本好书一样)。

答案 1 :(得分:1)

->运算符跟随指向结构的指针以引用结构的一个元素。在这种情况下:

temp->data = 5;
temp->next = head;

temp是指向struct test_struct类型结构的指针,该结构具有名为datanext的成员。这两个语句在temp指向的结构中为这两个成员赋值。

由于head在代码中设置为NULL,因此第二个语句确实将next成员设置为NULL

从技术上讲,temp->datatemp->next中的每一个都是 左值 (发音为“ell value”),这意味着它们可以是既用于它们引用的值,也用于存储值的位置。 “l”代表“左”作为助记符,表示这些东西就是你在赋值语句左侧的东西。

答案 2 :(得分:1)

你的代码是做什么的,它创建了一个变量名“temp”,它是一种test_struct *。然后它分配内存并将变量temp指向该内存块。此临时变量是指向使用malloc创建的内存块的指针。在“temp”里面它有两个变量名数据和下一个。在C中,访问您使用的会员 - &gt;运营商。 (第1行)您将整数5保存到temp中的数据变量。在第2行,你为下一个分配NULL(此时你的头是空的[得到它!你的头是空的:)])。然后你将头部指向临时指向的记忆片。现在,如果你printf(“%d”,head-&gt;数据),它将打印5。

我评论了代码中的每一行。希望这会有所帮助。

#include <stdio.h>
#include <stdlib.h>
struct test_struct{
    int data;
    struct test_struct *next;
};
struct test_struct* head = NULL; //Creates a global variable head. its type is test_struct* and it is currently set to NULL
int main(){
    head = NULL; //
    struct test_struct* temp = (struct test_struct*)malloc(sizeof(struct test_struct));// creates a variable named temp which is a test_struct* type.
    if(NULL==temp){ //at this point if temp is NULL, it imply that above line failed to allocate memory so there is no point executing this program so we return.
        printf("error in memory");
        return 0;
    }
    temp->data=5; // in the structure test_struct there is a member variable data inside it and since the temp variable is of type test_struct, temp also has data member. so we can access it by using -> operator. since data is a integer type we can assign a number to it.
    temp->next=head; //At this point head is NULL. So we are pretty much assigning NULL to temp->next
    head=temp; //When using link list we usually keep the head pointing to the beginning of the link list.(unless its a circular link list). This line does the exact same. It points the dead to memory piece that temp pointing to. 
    printf("%p\n",head);
    return 0;
}