单链表的概念
- 线性表的链式存储,一组任意的存储单元存储线性表中的数据元素
单链表的结构
- 元素自身信息+指向其后继的指针(从而建立数据元素间的线性关系)
- 头指针与头结点:头指针用于标识一个单链表,头节点方便操作。
-
typedef struct LNode{ //定义结点类型 ElemmType data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList;
单链表的实现
按序号查找结点值
LNode *GetElem(LinkList L, int i){
int j=1;
LNode *p=L->next; //头结点指针赋给p
if(i==0)
return L;
if(i<0)
return NULL;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
按值查找表结点
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
while(p!=NULL&&p->data!=e)
p=p->next;
return p;
}
插入节点操作
p=GetElem(L,i-1);
s->next=p->next;
p->next=s;
删除结点操作
p=GetElem(L,i-1); //查找删除位置的前驱结点
q=p->next;
p->next=q->next; //将*q结点从链中断开
free(q);
双链表
概念:俩指针分别指向前驱节点和后继节点
typedef struct DNode{
ElemType data;
struct Dnode *prior,*next;
}DNode,*DLinkList;
实现:
插入操作
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
删除操作
p->next=q->next;
q->next->prior=p;
free(q);
循环链表
- 循环单链表:无指针域为NULL的结点,判空条件为头结点是否等于头指针。
- 循环双链表:判空条件为头结点的prior域和next域都等于L。