目录
一、判断链表是否为空
二、单链表的销毁:链表销毁后不存在
三、清空单链表:链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)
四、求单链表的表长
五、单链表的取值
六、单链表的按值查找
七、单链表的插入
八、单链表的删除——删除第i个结点
九、建立单链表:头插法——元素插入在链表头部,也叫前插法
十、建立单链表:尾插法——元素插入在链表尾部, 也叫后插法
一、判断链表是否为空
1、空表:链表中无元素,称为空链表,但头指针和头节点仍然存在。
2、算法思路:判断头结点的指针域是否为空。
3、算法描述
int ListEmpty(LinkList L){ //若L为空表,则返回1,否则返回0if(L->next) //非空return 0;elsereturn 1;
}
二、单链表的销毁:链表销毁后不存在
1、算法思路:从头指针开始,依次释放所有结点。如下图所示:首先将头指针L赋给P,然后将头指针L指向下一个节点的指针域,之后删除指针P,结束条件为L等于空指针。
2、核心语句:
p=L;
L=L-> next;
delete p;
结束条件: L==NULL 循环条件: L!=NULL
3、销毁单链表的算法描述
Status DestroyList L(LinkList &L){ //销毁单链表L
Lnode *p; //或LinkList p;while(L) {p=L;L=L->next;delete p;
}
三、清空单链表:链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)
1、算法思路:依次释放所有结点,并将头结点指针域设置为空。具体过程及核心语句如下图所示:
2、清空单链表的算法描述
Status ClearList(LinkList & L){//将L重置为空表Lnode *p,*q; //或LinkList p,q;p=L->next;while(p) { //没到表尾q=p->next;delete p;p=q;
}L->next=NULL; //头结点指针域为空
return OK;
}
四、求单链表的表长
1、算法思路:从首元结点开始,依次计数所有结点。
2、求单链表表长的算法描述
int ListLength_L(LinkList L){ //返回L中数据元素个数LinkList p;p=L->next; //p指向第一个结点i=0;while(p){ //遍历单链表,统计节点数i++;p=p->next;}return i;}
五、单链表的取值
1、算法思路:
从首元结点开始依次顺着链域next逐个向下搜索,只要指向当前结点的指针P不为空(NULL),并且没有到达序号为i的结点,则循环执行以下操作:p指向下一个结点;计数器相应加1。直至搜素到第i个节点为止。
2、单链表的取值算法描述
Status GetElem L(LinkList L, int i, ElemType &e){ //获取线性表L中的某个数据元素的内容,通过变量e返回p=L->next; j=1; //初始化while(p&&j<i ){ //向后扫描,直到p指向第i个元素或p为空p=p->next;++j;
}if(!p||j>i) return ERROR; //第i个元素不存在e=p->data; //取第i个元素return OK;} //GetElem L
六、单链表的按值查找
1、算法步骤
①从第一个结点起,依次和e相比较。
②如果找到一个其值与e相等的数据元素,则返回其地址或者其在链表中的位置序号。
③如果查遍整个链表都没有找到其值和e相等的元素,则返回0或"NULL"。
2、算法描述(返回其地址)
//在线性表L中查找值为e的数据元素的地址
Lnode *LocateELem_ L (LinkList L, Elemtype e) {//在线性表L中查找值为e的数据元素//找到,则返回L中值为e的数据元素的地址,查找失败返回NULL
p=L->next;while(p &&p->data!=e)p=p->next;return p;}
3、算法描述(返回其在链表中的位置序号)
//在线性表L中查找值为e的数据元素的位置序号int LocateELem_L (LinkList L, Elemtype e) {//返回L中值为e的数据元素的位置序号,查找失败返回0
p=L->next;j=1;while(p&&p->data!=e){p=p->next; j++;}if(p) return j;else return 0;
}
七、单链表的插入
1、算法步骤如下图所示:
2、算法描述
//在L中第i个元素之前插入数据元素eStatus ListInsert_L(LinkList &L,int i,ElemType e){p=L;j=0;while(p && j<i-1){p=p->next; ++j;} //寻找第i-1个结点,p指向i-1结点
if(!p |j>i- 1)return ERROR; // i大于表长+1或者小于1,插入位置非法
s=new LNode; S->data=e; //生成新结点s, 将结点s的数据域置为e
S->next= p->next; //将结点s插入L中p->next=s;return OK;} //ListInsert_L
八、单链表的删除——删除第i个结点
1、算法步骤
2、算法
//将线性表L中第i个数据元素删除Status ListDelete_L(LinkList &L,int i,ElemType &e){p=L;j=0;while(p->next&&j<i-1){
p=p->next; ++j; //寻找第i个结点,并令p指向其前驱
}if(!(p->next)||j>i-1) return ERROR; //删除位置不合理q=p->next; //临时保存被删结点的地址以备释放p->next=q->next; //改变删除结点前驱结点的指针域e=q->data; //保存删除结点的数据域delete q; //释放删除结点的空间return OK;} //ListDelete_L
九、建立单链表:头插法——元素插入在链表头部,也叫前插法
1、算法步骤
①从一个空表开始,重复读入数据。
②生成新结点,将读入数据存放到新结点的数据域中。
③从最后一 个结点开始,依次将各结点插入到链表的前端。实例如下图所示:
2、算法描述
void CreateList_H(LinkList &L,int n){L=new LNode;L->next=NULL; //先建立一个带头结点的单链表for(i=n;i>0;--i){p=new LNode; //生成新结点用c语言:p=(LNode*)malloc(sizeof(LNode);
cin>>p->data; //输入元素值用c语言:scanf(&p->data);p->next=L->next; //插入到表头L->next=p;
}} //CreateList_H
注:上面的算法是直接用指针P来表示插入的结点
十、建立单链表:尾插法——元素插入在链表尾部, 也叫后插法
1、算法步骤
①从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。
②初始时,r同L均指向头结点。每读入一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新结点。图形解释,如下图所示:
2、算法
//正位序输入n个元素的值, 建立带表头结点的单链表L
void CreateList_R(LinkList &L, int n){L=new LNode;L->next=NULL;r=L; //尾指针r指向头结点for(i=0;i<n;++i){p=new LNode; cin>>p->data; //生成新结点 ,输入元素值
p->next=NULL;
r->next=p; //插入到表尾r=p; //r指向新的尾结点} //CreateList_R