单链表是由表头唯一确定的,因此单链表可以用头指针的各类名字来命名表头。如:头指针名是L,把链表称Wie表L。
typedef int ElemType,Status;
typedef struct Lnode{
ElemType data; //结点的数据域
struct Lnode *next; //指针域
}LNode,*Linklist; //Linkist为指向结构体Lnode的指针类型
首先来做一个直观的想象,将链表想象为一个个单独的条状的磁铁,它的物理状态和磁性分别代表数据域和结构域。
两极需要与其他的磁铁都为相加,现在再给磁性赋予意义,即看作通过next指针将两个磁铁相连,数据域看作载体,指针看作磁性,两个链表通过磁性相连。注意两个链表不存在物理意义上的直接相连,而是通过指针。
对链表的基本操作:
定义链表:
Status InitList _L(LinkList &L){
L=new LNode;
L->next=NULL;
return ok;//表示正确,#define ok 1;
}
上述链表的解释:
1.生成新结点作为头指针,并用头指针指向头指针
2.将头结点的指针域置空。
判断是否为空表
Status Iistempty(LinkList L){
if(L->next) return 0;
else return 1;
}
让指针指向下一节点,并进行判断。
销毁单链表:
Status destroylist_linklist &L){
Lnode *p;
while(L){
p=L;
L=L->next;
delete p;
}
单链表不空是,让p指向L并释放L的空间。
清空链表(清空数据):
Status clearlist(linklist &L)
{
Lnode *p,*q;
p=L->next;
while(p){
q=p->next;
delete p;
p=q; //将p赋值为空
}
L->next=NULL; //头指针为空
return ok;
}
求链表的长度
status listlength_l(linklist l){
linklist p;
p=L->next;
int i=0;
while(p){
i++;
p=p->next;
}
return i;
}
取单链表数:
Status getelem_l(linklist L, int i;elemtype &e){
p=L->next;
while(p&&j<i){
p=p->next;
++j;
}
if(!P||j>i) return 0;//链表为空,数字过大不符合
e=p->data;
return ok;
}
安值查找:
Lnode *Locateelemtype(linklist L,elemtype){
p=L->next;
while(p&&->data!=e)
p=p->next;
while(p&&p->data!=e)
p=p->next;
return p;
}
插入——在第i个结点前插入值为e的新结点
status list_insert(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; //将结点的数据指向e;
s->next=p->next;
p->next=s;
return ok;
}
删除——删除第二个结点
status list delete_list(link list &l, int i;elem type &e){
p=L;
j=0;
while(p->next&&j<i-1){p=p->next;++j;}
if(!(p->next)||j>i-1) return error;
q=p->next;
p->next=q->next; //删除结点前趋的指针域
e=q->next;
e=q->data;
delete p; //释放删除结点的空间
return ok;
}
持续更新,谢谢大家。