- 单链表的存储结构
typedef struct Lnode{
ElemType data;
struct Lnode *next;
}Lnode,*LinkList
- 单链表的初始化
(1)生成新节点作头结点,用头指针L指向头结点
(2)将头结点的指针域置空。
算法描述
Status InitList_L(LinkList &L){
L=new LNode;
L->next=NULL;
return OK;
}
- 判断链表是否为空:
空表就是链表中无元素,但是头指针和头结点依然存在
思路:判断头结点指针域是否为空
int ListEmpty(LinkList L){
if(L->next)
return 0;
else
return 1;
}
若L为空表,则返回1,否则返回0。
- 单链表的销毁
思路:从头指针开始,依次释放所有节点
Status DestroyList_L(LinkList &L){
Lnode *p;
while(L){
p=L;
L=L->next;
delete p;
}
}
- 清空链表
链表还存在,但链表中没有元素
思路:依次释放所有节点,并将头结点指针域置为空
Status ClearList(LinkList &L){
Lnode *p,*q;
p=L->next;
while(p){
q=p->next;
delete p;
p=q;
}
L->next=NULL;
return OK;
}
- 求单链表L的表长
int ListLength_L(LinkList L){
LinkList p;
p=L-next;
i=0;
while(p){
i++;
p=p->next;
}
}
- 取值——取单链表中第i个元素的内容
链表不是随机存取结构,所以需要逐个节点往下搜索。
算法步骤:
- 从第1个节点(L->next)顺链扫描,用指针p指向当前扫描到的节点,p初值p=L->next。
- j做计数器,累计当前扫描过的节点数,j初值为1
- 当p指向扫描到的下一节点时,计数器j加1。
Status GetElem_L(LinkList L, int i, ElemType &e){
p=L->next; j=1;
while(p&&j<i){
p=o->next;++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
- 插入节点
在第i个节点前插入值为e的新节点
算法示意图:
代码:
Status ListInsert_L(LinkList &L,int i, ElemType e){
p=L;j=0;
while(p&&j<i-1){
p=p->next;++j;
}
if(!p||j>i-1)
return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
- 删除节点