#这是我个人用C语言编写的建立单链表的方法,内容比较详细,适合初学者参考,有不专业的地方,还望各位老师不吝赐教!
#include<stdio.h>
#include<stdlib.h>
//PART1
typedef struct node {
int data; //结构体node中,存储一个整型变量data
node* next; //结构体node中,存储一个指向结构体类型变量的指针next
}Node;
//我们将node结构体的声明符修改为Node,在声明新结构体,就可以使用Node A,简单快捷
//PART2 函数function
Node* function(int* array, int length) {
//这是一个Node*型的函数function,接收一个整型数组array,返回一个指向头结点的指针
Node* head = (Node*)malloc(sizeof(Node*)); //2.1 动态申请一个名称为head的Node*指针类型的头节点
head->data = -1; //2.1.1 头结点的data不存储数据
head->next = NULL;
Node* point = head; //2.2 创建一个point指针,可以移动,首先指向head结点
for (int i = 0; i < length; i++) {
//循环建立数组长度的个数的结点
Node* now = (Node*)malloc(sizeof(Node*)); //2.3 动态申请一个名称为now的Node*指针类型的节点
//这里申请的为什么是指针Node*型?是因为我们函数返回值为Node*指针,链表每个结点类型需统一~
now->data = *(array++); //2.3.1 初始化结点now,访问指针结点成员需要用"->"
//这里为什么是*(array++),是为了顺序调用数组的每一个元素,直到array指针越界
now->next = NULL; //2.3.2 初始化now成员next指针为空指针,指向NULL
point->next = now; //2.4.1 让point指针指向的结点的next成员指向新建结点now
point = point->next; //2.4.2 让point指针指向下一个结点,保证它指向链表尾部
}
return head; //2.5 返回的是Node型指针,头指针head
}
//PART3 主函数
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9 }; //3.1 a作为我们的验证数组,可以以其它方式创建
int length = sizeof(a) / sizeof(int); //3.2 获取数组长度length
//printf("%d\n", length);
Node* list = function(a, length); //3.3 声明结点指针Node*型变量list,指向返回值头结点
Node* p = list->next; //3.4 验证程序,让p指向链表第一个结点
while (p) { //3.5 在p不为空指针时,调取p指向的结点的数据data
printf("%d ", p->data);
p = p->next; //3.5.1 每次调用过后,p都会指向下一个结点
//注:当p指向链表尾部的结点,由于function中每一次初始化都让结点的next指向了空NULL
//最后一个结点的next没有被修改,所以仍然指向空
}
return 0;
}
如有疑问,欢迎多多交流!