链表
链表(linked list)是一种很有用的数据存储方式。是线性的。依照我的理解就是很多个点连接起来,其中每个点包括两部分一部分是数据,一部分是指针(指向下一个节点的指针)。如下图:
在上图中每一个方框所代表的就是一个节点。每个节点中的指针都指向下一个节点的地址。
以上就是链表的概念,那么在C语言中如何创建一个链表呢?
首先我认为在学习链表之前要学会创建指向结构的指针这个操作,下面我们就说一下怎么创建指向结构的指针,并且如何对其中的元素进行操作。
#include<stdio.h>
#include<stdlib.h>
int main(){
struct Linked_list{
int number;
char c;
};
struct Linked_list *L;
/*
至此我们就创建了一个指向结构体
Linked_list的指针,但是这个结
构体并未分配存储空间。我们接下
来就要对其分配一个内存空间
*/
L=(struct Linked_list*)malloc(sizeof(struct Linked_list));
/*
这里我们就对L这个指针分配了一
个可以容纳整型和字符型大小的
内存空间,这个操作在链表中也
会出现
*/
(*L).number=5;
printf("%d",(*L).number);
L->number=6;
printf("%d",(*L).number);
/*
L->number
(*L).number
以上两种操作是等价的,都是访问
这个Linked_list这个结构体中的成
员
*/
return 0;
}
如果大家对结构体不太了解的话可以翻一翻这份专栏中第一个文章。
下面我们进入主题,如何创建一个链表,我们创建链表的时候需要实例化三个结构体指针head、new、end。其中head是这个链表的头指针是链表的开始,我们一般对这个节点不存储数据。end是这个链表结尾。new用来创建一个新的节点。
#include<stdio.h>
#include<stdlib.h>
int main(){
typedef struct person{
int number;
struct person *next;
//这里实例化了person结构体next是指向这个结构体的指针
}Link_list;
//这里struct person 与Link_list等价
Link_list *head=NULL;
//这里建立链表的头,就是实例化结构体head是一个指针指向这个结构体
Link_list *new=NULL;
//这里用来获得新的节点
Link_list *end=NULL;
//这个指针是链表的最后一个元素
/*
以上我们就创建好了一个链表中
所需要的的三个要素
*/
new=(Link_list*)malloc(sizeof(Link_list));
//在这里我们给new这个指针分配了一块内存,相当于创建了一个新的节点
head=new;
//我们将这个新的节点的地址给了head并且没添加任何元素。
end=head;
//因为这个链表中只有一个元素因此首和尾是一个节点
new=(Link_list*)malloc(sizeof(Link_list));
new->number=5;
//我们在第二个节点里面给number赋予了一个值
end->next=new;
//我们将第一个节点中的指针指向了新创建的节点
end=new;
//重新给尾节点赋值
end->next=NULL;
//第二个节点中的指针指向一个NULL意思是空指针
/*
以上我们创建了一个两个节点
的链表,其中第一个节点只有
指向第二个节点的指针,没有
保存数据,第二个节点存储了
一个整型数据,并且有一个指
向空类型的指针。
*/
return 0;
}
在上面我们创建了一个两个节点的链表(一般的链表不会怎么少,这里我们作为例子就创建两个节点)。
最后希望大家在阅读过程中指出我的错误或者对我的内容进行补充。