单链表是一种线性数据结构,与顺序表占据一段连续的内存空间不同,链表是用一组地址任意的存储单元来存储数据,每个存储单元分散在内存的任意地址上,存储单元之间用指针连接 。在链表中,每个数据元素都存放到链表的一个结点,结点之间由指针串联在一起,这样就形成了一条如同“链”的结构,故称作链表 。
通过下面的代码可定义一个单链表:
typedef struct node{其实上面这段代码定义的是一个单链表的结点 。每一个结点包括两部分:数据域和指针域 。其中数据域用来存放数据元素本身的信息,指针域用来存放后继结点的地址 。
ElemType data; //数据域
struct node * next; //指针域
} LNode,*LinkList;
上面使用typedef将结构体struct node定义为LNode类型,表示链表中每个结点的类型为LNode,它等价于结构体类型struct node 。另外,*LinkList是指向LNode类型的指针类型,当定义一个指向LNode类型数据的指针变量时,LNode *L与LinkList L是等价的 。
一个链表只要得到了头指针就可以操作链表上的每一个结点,因此把LinkList类型抽象地看作是单链表类型 。也就是说,只要得到了LinkList类型的链表头结点指针,就可以操作整个单链表 。
单链表的操作包括单链表的创建、结点插入、删除、链表销毁等,下以的实例就包括了这些方面的操作 。
先看运行效果:

文章插图
代码:

文章插图

文章插图

文章插图

文章插图

文章插图
对于线性表(顺序表和单链表)的遍历,注意指针移动的细微区别 。在顺序表中,申请一个指针p后,p指示数据元素的存储位置,用*p可取得该数据的值,用p++可以顺序进到物理上下一个元素的位置 。在单链表的情形下,指针p指示链表的结点地址,用*p不能取得该结点数据的值,用p++也不能进到下一个结点位置,只能使用p->data取得结点数据的值,用p=p->next进到下一个结点 。结点元素的插入,分为两种情况:
I 插入到单链表的最前面:

文章插图

文章插图
II 插入到中间位置:

文章插图

文章插图

文章插图
结点元素的删除,也分两种情况:
如果是删除头节点,只需要将将头节点的next指针赋值给单链表指针即可:*list = q->next;
如果是删除中间位置的节点:

文章插图

文章插图
源码:
#include "stdio.h"
#include "malloc.h"
typedef struct node{
int data;
struct node *next;
}LNode,*LinkList;
LinkList GreatLinkList(int n)
{
/*建立一个长度为n的链表*/推荐阅读
- sci包括哪些期刊 核心期刊有哪些
- ai波浪线画法,ai怎样才可以画波浪线
- 摩尔曼斯克为什么是终年不冻港,摩尔曼斯克为什么叫终年不冻港
- PS怎样才可以去掉,ps怎么抠图把不要的去掉
- 微信怎么解除限制加好友
- PS磨砂效果要怎样才可以做,如何利用ps制作磨砂效果图
- 木星等于多少个地球,一个木星等于几个地球
- 华为手机怎么设置不限制流量,华为手机流量限额设置怎么取消限制
- 微信里拍一拍在哪,微信拍一拍怎么设置
