数据结构单链表的插入与删除

单链表是一种线性数据结构,与顺序表占据一段连续的内存空间不同,链表是用一组地址任意的存储单元来存储数据,每个存储单元分散在内存的任意地址上,存储单元之间用指针连接 。在链表中,每个数据元素都存放到链表的一个结点,结点之间由指针串联在一起,这样就形成了一条如同“链”的结构,故称作链表 。
通过下面的代码可定义一个单链表:

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的链表*/

推荐阅读