单链表Single-LinkList

0、节点结构体定义

cpp 复制代码
typedef struct LNode{
	
	int data;
	struct LNode *next;
	
} Lnode, *LinkList;

1、初始化

cpp 复制代码
bool InitList(LinkList &L)	//初始化 
{
	L = new LNode;
	
	if(!L){
		return false;
	}
	L->next = NULL;
	
	return true;
}

2、创建

(1)头插法

cpp 复制代码
void CreateList_H(LinkList &L, int n)	//头插法创建 
{
	LinkList s;
	
	while(n--){	//--n不行!! 
		s = new LNode;
		
		cin>> s->data;
		
		s->next = L->next;		//链表的i++ 
		L->next =s;	
	}
}
//反复利用链表头L和新节点s添加(就是插入...) 

(2)尾插法

cpp 复制代码
void CreateList_R(LinkList &L, int n)	//尾插法创建 
{
	LinkList s, r = L;
	
	while(--n){
		s = new LNode;
		
		cin>> s->data;
		
		r->next = s;			//链表的i++
		s->next = NULL;
		r = s;
	}
}
//利用r存储当前节点信息,便利于新节点s的添加 

3、查找

(1)查找具体元素

cpp 复制代码
bool Finde(LinkList &L, int e)	//查找具体元素 
{
	LinkList p = L->next;
	
	while(p != NULL && p->data != e){
		p = p->next;
	}
	if(!p){
		return false;
	}
	return true;
}

(2)查找第 i 个元素

cpp 复制代码
bool GetElemi(LinkList &L, int i, int &e)	//查找第i个元素 
{
	int j = 1;				//记不住就初始化为 j = 1、p = L 
	LinkList p = L->next;  //因为后面都是这样(保对),而且也没增加什么时间 
	
	while(p && j<i){
		p = p->next;
		++j;
	}
	if(!p || j>i){		//i值不合法:i>n || i<0 
		return false;
	}
	e = p->data;		//用e记录元素i 
	
	return true;
}

4、插入

cpp 复制代码
bool ListInsert(LinkList &L, int i, int e) 	//在第i个元素后插入元素 
{
	 int j = 0;
	 LinkList p = L;	//保证能在第一个元素前插入 
	 
	 while(p && j<i){
	 	p = p->next;
	 	++j;
	 }
	 if(!p || j>i){
	 	return false;
	 }
	 //上面就是查找操作... 
	 LinkList s = new LNode;
	 
	 s->data = e;
	 
	 s->next = p->next;
	 p->next = s;
	 
	 return true;
}

5、删除

cpp 复制代码
bool ListDelete(LinkList &L, int i)	//删除第i个元素 
{
	int j = 0;
	LinkList p = L;		//保证能删除第 1个元素 
	
	while(p && j<i-1){
		p = p->next;
		++j;
	}
	if(!p ||j>i-1){
		return false;
	}
	//上面还是查找操作...(找第元素i-1)
	LinkList q = p->next;	//使用临时变量更安全!(p->next->next = p->next; delete p->next; 
	
	p->next = q->next;	   //当n=2时会出错!因为要删除的p->next已经变成NULL了!) 
	
	delete q;
	
	return true;
}

6、释放内存

cpp 复制代码
bool ListRelese(LinkList &L)
{
	LinkList p;
	
	while(L){
		p = L;			//暂存当前节点 
		L = L->next;	//更新为下一节点 
		delete p;		//删除当前节点 
		
		/*这样也ok: 
		**p = L->next;// 暂存下一个节点
		**delete L;// 删除当前节点
		**L = p;// 更新当前节点为下一个节点
		*/
	}
	
	return true;
}

7、其他操作

(1)查找中间元素

cpp 复制代码
LinkList FindMid(LinkList L)	//查找中间的节点 
{						//不会修改L就不用传引用!
	LinkList p = L, q = L;
	
	while(p){
		q = q->next;
		p = p->next->next;
	}
	return q;
}

(2)查找倒数第 k 个节点

cpp 复制代码
LinkList Findk(LinkList L, int k)	//查找倒数第k个节点 
{
    LinkList p, q;
    p=L->next; 
    q=L->next; 
    while(p->next!=NULL)
    {
        if(--k<=0) //k减到0时,慢指针开始走
            q=q->next; 
        p=p->next; //p为快指针,先走k-1步
    }
    if(k>0)
        return NULL;
    else
    	return q; 
}

(3)合并有序链表

cpp 复制代码
/合并有序链表:将两个有序(非递减)单链表La和Lb合并为一个新的有序(非递减)单链表Lc 
LinkList ListMerge(LinkList LA, LinkList LB)
{
	LinkList p = LA->next ,q = LB->next; 
	LinkList LC = LA, r = LC;
	
	while(p && q){
		if(p->data > q->data){
			r->next = q;
			r = q;
			q = q->next;
		}else{
			r->next = p;
			r = p;
			p = p->next;
		}
	}
	r->next = p? p:q;
	
	delete LB;
	
	return LC;
} 

(4)逆转链表

cpp 复制代码
void ListReverse(LinkList &L)	//逆转单链表 
{
	LinkList p = L->next, q;
	L->next = NULL;
	
	while(p){
		q = p->next;
		
		p->next = L->next;
		L->next = p;
		
		p = q;
	} 
}
相关推荐
.Cnn几秒前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论
2401_858286116 分钟前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·
曙曙学编程8 分钟前
初级数据结构——树
android·java·数据结构
小技与小术11 分钟前
数据结构之树与二叉树
开发语言·数据结构·python
Beau_Will12 分钟前
数据结构-树状数组专题(1)
数据结构·c++·算法
爱吃烤鸡翅的酸菜鱼16 分钟前
Java算法OJ(8)随机选择算法
java·数据结构·算法·排序算法
hunandede44 分钟前
av_image_get_buffer_size 和 av_image_fill_arrays
c++
寻找码源1 小时前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
手握风云-1 小时前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
怀澈1222 小时前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++