#include<stdio.h>
#include<stdlib.h>
struct node
{
int num;
struct node * next;
//结构体类型的成员是指针,其指向结构体的,结构体的名字只能是结构体自己的
};
// void create_link(Link head)
// {
// head=NULL;
// }
typedef struct node Node;//struct node结构体类型,不是指针,定义类型
typedef Node* Link;//struct node*结构体类型的指针取名为Link(指针变量)
Link create_link(Link * head) //创建空链表,没有节点
{
*head=NULL; //head指向空NULL
return *head;
}
void create_node(Link * new_node) //我所创建的新的(节点)链表的值
//create node分配一个新的空间分配地址,并返回来
{
*new_node=(Link)malloc(sizeof(Node));
//malloc分配空间,空间只要分配成功,节点就有了,节点必须真实存在
//分配空间时,结构体是将来节点的构成方式(值域、指针定义、指向)
//malloc返回的是void*,转换成结构体类型的指针Link,指向你所分配的起始位置
//用来当节点使用的,new_node指向新的节点的,
//输出函数,利用函数这个参数要带回你所创建的新节点的起始地址
//指针作为函数参数,参数传递方向是双向,形参影响实参,
//一定是对形参的间接运算,取内容*new_node是一级指针
//new_node是二级指针
}
void insert_node_head(Link * head,Link new_node)
{
new_node->next=*head;
*head=new_node;
}
void display_link(Link head) //head是形参,已获得主函数的链表
{
Link p=NULL;
p=head; //head不一定可移动,p指针做引领,指向头节点
while(p!=NULL)
{
printf("%d\n",p->num); //结构体里:1、指针变量->成员;2、普通变量.成员
p=p->next; //指针变量p指向下一个节点
}
}
int main()
{
Link head;//Node * head; struct node * head;
//定义了指向链表的指针;link定义head,是一个指针;头指针
Link new_node=NULL;
int i;
create_link(&head);//创建链表,带回新的链表的起始位置
//二维指针能带回(返回)一个地址(指针)
//head原本没有指向,是空的(没有地址),创建链表以后,head指向创建的链表
//链表可为空,“有节点无链表”是不行的
for(i=0;i<10;i++)
{
create_node(&new_node);
//创建节点,参数取二级指针,因为修改以后需要带回新的值,新创建的节点的起始位置
new_node->num=i+1;
insert_node_head(&head,new_node);
//头指针就是一个链表,把新创建的节点带到头指针所指向的链表
//head 指向新的链表,会改变头指针的指向,返回新的地址
//链表是顺序访问,&head是二级指针,new_node是一级指针
//判断二级指针:需不需要传递新的值,二级指针需要返回新的地址
//节点new_node传给head链表中,head不改变new_node的位置———依据
}
display_link(head);
return 0;
}
结果:
judy@judy-virtual-machine:~/桌面/preview$ gcc love6.c -olove6
judy@judy-virtual-machine:~/桌面/preview$ ./love6
10
9
8
7
6
5
4
3
2
1