单链表-乡巴老也能看懂
链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑
顺序是通过链表中的指针链接次序实现的。链表由一系列节点(链表中没一个
元素成为节点) 组成,节点可以在运行时动态生成。每个节点包括两个部分;
一个时存储数据元素的数据域,另一个时存储下一个节点地址的指针域。
相比较的数组,链表结构与之有如下区别:
(1) 数组通常在创建的时候就需要设定数据的大小,使用链表结构可以
克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空
间,实现灵活的内存动态管理:
(2) 链表由于增加了节点的指针域,空间开销比较大:
(3) 在中间插入或删除元素(节点)时,链表非常的灵活,不需要移动
其他元素(节点)的位置:
(4) 数组可以随机存储数据 , 但是链表不允许随机存取。
链表 (由多个节点组成,分散存储 由指针链接起来呢,)
节点组成(两部分:1数据域 2.指针域-存储下一个节点的指针)
节点1 节点2 节点3 节点4
数据 指针域 数据 指针域 数据 指针域 数据 指针域
指向节点2 指向节点3 指向节点4 指向NULL
插入节点
节点1要插入节点
数据 指针域数据 指针域
直线新的节点 指针指向要插入位置后面节点的地址
最后他们组成了一个新的链表
方式1 头指针 头指针指向第一个数据节点
head =
NULL 需要判断 是否为空
方式2 头节点
头节点 数据不使用 指针指向
//结构的数据类型
typedf struct Node{
int data;
struct Node*next;
}Node;
//链表类型
typedef struct List{
Node *head;
}List;
//1创建节点
Noode* CreateNode (int data){
Node *PtrNode = malloc(sizeof(Node));
PtrNode->data = data;
PtrNode->next = NULL;
return PtrNode;
}
//2向头结点位置插入新结点、
void PushHead(List *list , int data){
Node*PtrNew = CreateNode(data); //
PtrNew->next =list->head;//如果链表有节点
list->head = PtrNew ;//如果链表中无节点
}
//遍历链表
void tralve (List *list){
printf("链表中的元素");
Node *PtrHead= list->head;//操作是指针指向可以发生变化
if(!PtrHead){
put("空");
}
while(PtrHead){
printf("%d",PtrHead->data);
PtrHead = PtrHead->next;
}
printf("\n");
}
//4 计算结点个数
int length(List *list){
int count =0;
Node *PtrHead = list ->head;
while(PtrHead){
count++;
PtrHead = PtrHead ->next;
}
}
int main(){
List list;
list.head = NULL;//头指针
PushHead(&list,1);
tralve(&list);
PushHead(&list,2);
tralve(&list);
PushHead(&list,3);
tralve(&list);
printf("length = %d\n",length(&list));
return 0;
}