1.链表的简要概况
由于顺序存储具有一些局限性,例如:顺序表需要**预分配**一定的空间,所以可能造成空间的浪费或者是空间不够用的情况;顺序表的插入和删除都需要**移动大量的元素**,导致插入和删除的时间复杂度高。
所以,如果线性表要频繁的进行插入和删除操作时,就常常采用链式存储结构,链式存储结构不要求逻辑上相邻的数据元素在物理上也相邻,因此只能沿着某个指针进行**顺序存取**。
链表由一个个结点通过指针链接而成,每一个结点包含存放数据元素值的***数据域***和存放指向逻辑上相邻结点的***指针域***。
单链表的存储结构可以表示为:
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
上述描述中,将单链表的结点类型命名为LNode,而将指向结点的指针类型命名为LinkList。
2.单链表上基本操作的实现
(1)初始化一个链表
LinkList InitList()
{
LinkList L = (LinkList)malloc(sizeof(LNode)); //为头结点分配空间
L->next = NULL; //头结点的下一个指向为空
return L;
}
(2)单链表上的查找操作-时间复杂度为O(n)
/(1) 查找线性表中位序号为i的数据元素结点,如果查找成功,返回元素值
Status GetElem(LinkList L,int i,ElemType *e){
LinkList p;
p = L;
for(int j=1;j<=i;j++){
p = p->next;
}
e = &(p->data);
return OK;
}