链表的创建
因为对链表使用不太熟悉,学习使用数组创建了一个链表并访问,代码如下:
以后学到新的知识继续补充。
#include<stdio.h>
#include<stdlib.h>
// 节点的定义
struct node {
int value;
struct node* next;
};
// 创建带头节点的空链表
struct node* list_create() {//返回一个节点的指针,链表用头节点的指针表示链表
struct node* list = (struct node*)malloc(sizeof(struct node));//使用malloc函数向堆空间申请动态空间用法:(强制返回类型转换)malloc(申请内存大小)
//sizeof(struct node)结构体内存的大小
//函数中每一个变量都是在栈空间中的,函数调用完后内存就回收了
//堆空间中的变量或数组(一块内存)是永久的,直到关闭程序或主动删除
if (list == NULL) {
return NULL;//头节点指的链表为空,是空链表
}
list->next = NULL;//0
return list;//把这块内存的首地址返回
}
// 使用数组创建一个链表
struct node* list_create(int data[], int n) {
//创建头节点
struct node* list = (struct node*)malloc(sizeof(struct node));
if (list == NULL) {
return NULL;
}
struct node* p = list;
for (int i = 0; i < n; i++) {
//创建新节点,tmp为临时变量
struct node* tmp = (struct node*)malloc(sizeof(struct node));
//设置数据域
tmp->value = data[i];
//链接
p->next = tmp;
//p指针后移
p = p->next;//或 p = tmp;
}
//注意!这里第一次写的时候又犯错误了!p->next指的是最后的节点,必然是在for循环之后产生最后的节点,这两句话当然是写在for循环外面了
//如果写在for循环里面,最后只会打印一个数字1,因为第一次for循环的p->next已经为空并且返回,链表只储存了一个数字
p->next = NULL;//新节点的指针域指向空
return list;
}
//测试一下链表
void list_visit(struct node* list) {
if (list == NULL) {
return;
}
//for(定义一个指针p指向第一个节点(头节点list,只有指向域);
//这个节点非空(即p!=NULL);
//每循环一次指向下一个节点)
//这是最经典的链表循环
//可以类比普通循环for (int i = 0, i < 5, i++)
for (struct node* p = list->next; p; p = p->next) {
printf("%d ", p->value);
}
}
int main(void) {
int data[10] = { 1,2,3,4,5,6,7,8,9,10 };
struct node* list = list_create(data, 10);//创建链表
list_visit(list);//访问链表
return 0;
}