本文主要讲解单链表的基本定义,实现第一个单链表程序。
初识单链表:
- 链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素和下一元素的地址。
- 链表中的数据是以结点来表示的,每个结点的构成:元素 + 指针(下一元素的存储位置)。元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
定义:
链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的,每个结点只有一个链域的链表称为单链表(Single Linked List)。
单链表特性:
- 物理上不连续,逻辑上连续:可以将物理地址上不连续的内存空间连接起来,通过指针来对物理地址进行操作,实现逻辑上的连续(线性)。
- 头指针:单链表中每个结点的存储地址是存放在其前趋结点的next域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定。
- 尾巴:终端结点无后继,故终端结点的指针域为空,即NULL。
- 单链表节点定义:
typedef struct node
{
int data;
struct node* next;
}Node;
两种分类:带头结点的单链表和不带头头结点的单链表
- 不带头结点的单链表:也就是 head 只是一个指针,指向链表的第一个节点 。
- 带头结点的单链表:头结点的data不保存信息,next指针指向链表的第一个具有data域结点。
第一个单链表程序
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
typedef struct node
{
int data;
struct node* next;
}Node; //struct node 完全等于 Node(结构体变量)
typedef Node* LinkList; //struct node * 完全等于 LinkList(结构体指针)
int main()
{
LinkList head = (LinkList)malloc(sizeof(Node));
assert(head != NULL); //检查malloc之后是不是空间不够,返回了空指针NULL(WarningC6011:取消对NULL指针的引用)
LinkList NodeAa = (LinkList)malloc(sizeof(Node));
assert(NodeAa != NULL);
LinkList NodeBb = (LinkList)malloc(sizeof(Node));
assert(NodeBb != NULL);
LinkList NodeCc = (LinkList)malloc(sizeof(Node));
assert(NodeCc != NULL);
head->data = 101;
head->next = NodeAa;
NodeAa->data = 202;
NodeAa->next = NodeBb;
NodeBb->data = 303;
NodeBb->next = NodeCc;
NodeCc->data = 404;
NodeCc->next = NULL;
LinkList p = head; //把链表的头结点交给指针p,去遍历
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return 0;
}