/*
- @Author: Marte
- @Date: 2019-01-30 22:47:07
- @Last Modified by: Marte
- @Last Modified time: 2019-01-31 18:53:53
- 可以没有头结点,但一定要有头指针
- 其实不管是结点还是说链表,都只是一个称号,而最好表达的是指针,然而所创建的指针其实就等价于该指针所指的结点的地址空间,所以说只有地址空间是真实存在的,
- 至于人们经常用头指针的名称去代替链表的名称罢了
- typedef是类型定义的意思,为了使用结构体方便,如使用list_single就是为了可以省去struct这个关键字
*/
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct list_node//结点基本结构,也是单位链表的基本结构
{
int data;//数据域
struct list_node*next;//指针域
};
typedef struct list_node list_single;//重新定义链表结点为单位链表
list_single creat_list_node(int data)//创建一个能创建链表的函数,该链表包含头指针和第一个结点,如果只有一个结点,结点的指针域指向NULL
/声明定义一个函数指针,指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
声明格式为:类型标识符 函数名(参数表)/
{
list_singlenode = NULL;//创建链表头指针,一般头指针也是链表名
node = (list_single)malloc(sizeof(list_single));//开辟了存放第一个结点的空间,并且返回给头指针node一个指针(即第一个结点的地址),并赋予给头指针node,node现在即是头指针的名称,也可以是链表的名称
if(node==NULL){//带头结点单链表的初始化
printf("malloc fair\n");
}
memset(node,0,sizeof(list_single));//清空头指针所指向空间
/*memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,
count:是buffer的长度.
这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))
Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
例:char a[100];memset(a, '/0', sizeof(a));
memset可以方便的清空一个结构类型的变量或数组。*/
node->data = data;
node->next = NULL;//这里创建了一个头结点(不过该头指针带有数据),即同时运用了头指针和头结点
return node;
}
int main(void) {
int data = 100;
list_single *node_ptr = creat_list_node(data);//创建一个只有一个结点的链表,当然其实就是创建了由一个头指针和该指针指向的地址空间构成的链表结构
printf(“node_ptr->data=%d\n”,node_ptr->data);//打印第一个结点的数据域
printf(“node_ptr->next=%d\n”,node_ptr->next);//打印结点指针域
free(node_ptr);
return 0;
return 0;
}