#include <stdio.h>
#include <stdlib.h>
typedef struct _st_node // 定义节点结构体
{
int data; // 数据域
struct _st_node *next; // next域
}st_node; // 构建st_node数据类型
void travel_list(st_node *head); // 在函数定义前调用函数需要在进入main函数之前声明
int main(int argc,char**argv)
{
st_node *head =NULL; // 创建头,head是个局部变量在栈中分配内存,定义为空
st_node *new_node; // 创建新节点,new_node也是个局部变量,在栈中分配
int i;
for(i=0;i<10;i++)
{
new_node=malloc(sizeof(st_node)); // 给新节点分配内存空间,用malloc(sizeof(?))从堆里分配
if (NULL==new_node)
{
printf("malloc failure\n");
return 0;
} // 判断是否成功分配内存,若为空分配失败,打印错误信息并返回
new_node->data=i+1; // 给增加的数据节点一个一个赋值,第一个数据data=1,第二个=2……第十个=10
//因为采用头插方法,因此打印出来的信息是 (头)-10-9-8-7-6-5-4-3-2-1(第一个数据)
if(head==NULL)
{
head=new_node; // 若链表中无节点,直接插入新节点
}
else
{
new_node->next = head;
head = new_node;
} // 若链表中已有节点,要用头插法的话,使新节点的next域指向原来第一个数据的首地址(即head的地址),使插入新节点后的head指向新节点的首地址
}
travel_list(head);
return 0;
}
/*打印链表所有节点的data值*/
void travel_list(st_node *head) // 把链表的头传进来
{
st_node *node; //定义一个node节点
node=head;
while(node != NULL) //如果node节点(非空)有data值就打印
{
printf("data:%d\n",node->data);
node=node->next; //然后插入下个节点
}
return;
}
[luoyiran@luoyiran ~]$ gcc link.c -o link
[luoyiran@luoyiran ~]$ ls
! a.out bin Firefox_wallpaper.png hahahha hahahha.tar.gz link link.c link.o log.txt test workspace 模板 视频 图片 文档 下载 音乐 桌面
[luoyiran@luoyiran ~]$ ./link
data:10
data:9
data:8
data:7
data:6
data:5
data:4
data:3
data:2
data:1
查看malloc需要包含的头文件: 用man命令
[问题]:new_node存在堆中还是栈中?
这是一个坑,new_node指向 的malloc分配的内存空间由堆分配,而new node在系统中是个局部变量,存放在栈区