链表的简单创建
1. 什么是链表
我们先来想一下,在一个数组中我们只能储存同一类型的数据,而且数组的地址是连续的。
假设一个数组如果特别大的话,那么就会在系统中占用很大一部分的 "地址连续"内存空间 ,而且这个数组中的每一个元素还只能是同一种类型。
链表可以理解为一个结构体数组,不过这个数组的地址在内存空间中不连续,一个元素的地址不能通过上一个或者下一个元素通过地址的加减值直接推出。
2. 为什么要用链表
链表相对于数组的优点是:
- 链表中的每一个元素都是一个结构体(也叫结点),所以链表每一个元素可以存多种类型的值(即结构体里面定义的多种类型)
- 链表的在内存中的地址是不连续的(每一个元素的地址不能通过上一个元素的地址推出),所以在需要在每一个结构体变量中定义出一个可以储存下一个元素的地址的变量(也就是指针)。
3. 链表的简单实现
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data; // 每一个结点中存的元素(当然也可以是多个)
struct node * next; // 指向下一个节点的指针
}Node;
//定义每一个结点
int main(void){
Node * head = NULL; // 头指针
Node * currect;
int i, len;
printf("请输入您要添加的数组的长度:\nlen = ");
scanf("%d", &len);
for(i = 0; i < len; ++i){
Node * New = (Node *)malloc(sizeof(Node));
// 每添加一个新的结点 ,就为其分配内存空间
scanf("%d", &New->data);
if(head == NULL){ // 将头指针连向第一个结点
head = New;
}
else{
currect -> next = New;
}
New -> next = NULL;
// 让链表最后一个结点的指针域为空 ,为了后序遍历的方便
currect = New; // 控制currect指针总是指向最后一个结点
}
4. 链表的遍历
Node * p = head;
while(p != NULL){
//如果指针域不为空 ,则继续
//如果空,则退出(已遍历完成)
printf("%d ",p -> data);
p = p -> next; //让p指向下一个节点
}