C 在这个链表程序中,每一行做什么?

C 在这个链表程序中,每一行做什么?,c,linked-list,computer-science,C,Linked List,Computer Science,下面是我正在处理的一个链表,我试图弄清楚每一行的确切功能。我学习编程的方式似乎非常困难,我感到非常沮丧。不管怎样,我理解链接列表是如何工作的,但我不理解代码在说什么,以及它到底在做什么来创建结构。例如:我不明白为什么要将指针分配给节点(13和14),特别是当我理解指针是用来存储内存位置时 #include <stdio.h> #include <stdlib.h> #include <math.h> struct numnode { int val;

下面是我正在处理的一个链表,我试图弄清楚每一行的确切功能。我学习编程的方式似乎非常困难,我感到非常沮丧。不管怎样,我理解链接列表是如何工作的,但我不理解代码在说什么,以及它到底在做什么来创建结构。例如:我不明白为什么要将指针分配给节点(13和14),特别是当我理解指针是用来存储内存位置时

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

struct numnode
{
    int val; 
    struct numnode * next;
};
typedef struct numnode node;

main()
{
    int i;
    node * head;
    node * newnode;
    head = NULL;

    for (i = 1; i <= 10; i++)
    {
        newnode = (node *) malloc(sizeof(node));
        newnode->val = i;
        newnode->next = NULL;

        if (head == NULL)
        {
            head = newnode;
        }
        else
        {
            newnode->next = head;
            head = newnode;
        }
    }
}
#包括
#包括
#包括
结构节点
{
int-val;
结构numnode*next;
};
typedef结构numnode节点;
main()
{
int i;
节点*头;
节点*新节点;
head=NULL;
对于(i=1;i val=i;
newnode->next=NULL;
if(head==NULL)
{
头=新节点;
}
其他的
{
新建节点->下一步=头部;
头=新节点;
}
}
}

如果您修复了所指出的语句,您将发现代码插入了头部。它将以一个列表结束,其值从9下降到1。

以下是一些注释(以及减少代码量的小编辑)

/*链表节点定义*/
结构节点{
int-val;
结构节点*下一步;
};
int main(){
int i;
结构节点*头,*新节点;
head=NULL;
对于(i=1;i val=i;
新建节点->下一步=空;
//if块实际上是不必要的。。。
if(head==NULL){
//如果链表为空,则将头指针设置为初始节点
head=新的_节点;
}否则{
//现在您有了新节点,请连接它。开始:
//head->[当前链接列表]
//[新建节点。下一步]->NULL
新建节点->下一步=头部;
//head->[当前链接列表]->。。。
//[新建节点.下一步]->[当前链接列表]->。。。
头=新节点;
//head->[新节点.下一个]->[当前链接列表]->。。。
}
}
}

关键是
malloc
返回一个指向内存的指针。每个新节点都是动态分配的,因此是内存中的一个位置(不是基本类型)。

指针只是告诉你值在哪里,就像电话号码一样,你可以给任何人打电话,不管他是谁,因为你知道这个号码。指针可以指向任何东西(在您的访问权限下)根据需要,无论是int还是struct。

以下是此代码的摘要:

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

struct numnode
{
    int val; 
    struct numnode * next;
};
typedef struct numnode node;

main()
{
    int i;
    node * head;
    node * newnode;
    head = NULL;

    for (i = 1; i <= 10; i++)
    {
        newnode = (node *) malloc(sizeof(node));
        newnode->val = i;
        newnode->next = NULL;

        if (head == NULL)  // It'll be NULL first time, as head = NULL.
        {
            // True @ i = 1
            head = newnode;
        }
        else // Afterwards, as head=newnode
        {
            // New node will be created every time. Till i <= 10.
            newnode->next = head;
            head = newnode;
        }
    }
}
#包括
#包括
#包括
结构节点
{
int-val;
结构numnode*next;
};
typedef结构numnode节点;
main()
{
int i;
节点*头;
节点*新节点;
head=NULL;
对于(i=1;i val=i;
newnode->next=NULL;
if(head==NULL)//它第一次将为NULL,因为head=NULL。
{
//真@i=1
头=新节点;
}
else//之后,作为head=newnode
{
//每次都会创建新节点,直到i next=head;
头=新节点;
}
}
}
这是一个简单的代码


PS:if(head=NULL)为
head==NULL

如果head==null,不应该这样吗?要了解每一行的作用,请在调试器中运行代码。这将允许您一次一行地遍历代码。因此,当启动malloc时,它会创建一个指针,因此该指针被分配给新的_节点,对吗?将指针放在malloc(节点*)之前有什么意义?(第7行从main开始,包括main。)那到底是什么意思?抱歉,这是一个输入错误。
malloc
返回类型为
void*
的指针和
(结构节点*)
是一种类型转换,它告诉编译器将指针视为
结构节点*
。在这种情况下,它不是明确要求的,但这是一种良好的做法。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct numnode
{
    int val; 
    struct numnode * next;
};
typedef struct numnode node;

main()
{
    int i;
    node * head;
    node * newnode;
    head = NULL;

    for (i = 1; i <= 10; i++)
    {
        newnode = (node *) malloc(sizeof(node));
        newnode->val = i;
        newnode->next = NULL;

        if (head == NULL)  // It'll be NULL first time, as head = NULL.
        {
            // True @ i = 1
            head = newnode;
        }
        else // Afterwards, as head=newnode
        {
            // New node will be created every time. Till i <= 10.
            newnode->next = head;
            head = newnode;
        }
    }
}