王道数据结构链表

删除带头结点的单链表中所有值为x的结点

//删除带头结点的单链表中所有值为x的结点,
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{//定义结构体 
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[6]={1,2,3,4,5,6};
int n=6;
void buildlist(linklist &L){//尾插法建立链表 
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
} 
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
//删除函数
void deletex(linklist &L,int x){
	lnode *p=L->next,*q,*r=L;
	while(p){
		if(p->data==x){
			q=p;
			p=p->next;
			free(q);
		}else{
			r->next=p;
			r=p;
			p=p->next;
		}
	}
} 
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	deletex(L,3);
	disp(L);
	return 0;
}

带头结点的链表中删除最小值x

//带头结点的链表中删除最小值x
#include<bits/stdc++.h>
using namespace std;
//定义结构体 
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[4]={2,3,1,4};
int n=4;
//尾插法建立链表
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));//创建头结点
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	} 
	r->next=NULL;
	
}
//输出函数 
void disp(linklist L){
	lnode *s = L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
//开始删除最小值
void deletemin(linklist &L){
	lnode *pre=L,*p=pre->next;
	lnode *minpre=pre,*minp=p;
	while(p){
		if(p->data<minp->data){
			minp=p;
			minpre=pre;
		}else{
			pre=p;
			p=p->next;
		}
	}
	minpre->next=minp->next;
	free(minp);
} 
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	deletemin(L);
	disp(L);
	return 0;
}


依次删除最小值并输出

//依次删除最小值并输出 删一个释放一个空间 不使用数组作为辅助空间
#include<bits/stdc++.h>
using namespace std;
//定义结构体
typedef struct lnode {
	int data;
	struct lnode *next;
} lnode,*linklist;
int a[4]= {2,3,1,4};
int n=4;
//尾插法建立链表
void buildlist(linklist &L) {
	L=(linklist)malloc(sizeof(lnode));//创建头结点
	lnode *s,*r=L;
	for(int i=0; i<n; i++) {
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;

}
//输出函数
void disp(linklist L) {
	lnode *s = L->next;
	while(s) {
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
//开始删除最小值
void deletemin(linklist &L) {

	while(L) {
		lnode *pre=L,*p=pre->next;
		lnode *minpre=pre,*minp=p;
		while(p) {
			if(p->data<minp->data) {
				minp=p;
				minpre=pre;
			} else {
				pre=p;
				p=p->next;
			}

		}
		cout<<minp->data<<" ";
		minpre->next=minp->next;
		free(minp);
	}
	free(L);

}
int main() {
	linklist L;
	buildlist(L);
	disp(L);
	deletemin(L);
	return 0;
}




有序链表中删重复元素

#include<bits/stdc++.h>
using namespace std;
//定义结构体
typedef struct lnode {
	int data;
	struct lnode *next;
} lnode,*linklist;
int a[10]= {1,2,2,3,3,4,5,6,6,7};
int n=10;
//尾插法建立链表
void buildlist(linklist &L) {
	L=(linklist)malloc(sizeof(lnode));//创建头结点
	lnode *s,*r=L;
	for(int i=0; i<n; i++) {
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;

}
//输出函数
void disp(linklist L) {
	lnode *s = L->next;
	while(s) {
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
void deletelist(linklist &L){

	lnode *p=L->next,*q;
	while(p->next){
		q=p->next;
		if(p->data==q->data){
			p->next=q->next;
			free(q);
		}else{
			p=p->next;
		}
		
	}
}
int main() {
     linklist L;
     buildlist(L);
     disp(L);
     deletelist(L);
     disp(L);
	return 0;
}








删绝对值

//删绝对值相同的结点 已知|data|<=n,保留第一个出现的值 
//要求算法高效 遍历一遍
//那么就得用空间换时间了 使用辅助整数数组q
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[5]={21,-15,-15,7,15};
int m=5;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<m;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
void deletesame(linklist &L,int n){
	lnode *p=L,*f;
	int *q;
	q=(int *)malloc(sizeof(int)*(n+1));
	for(int i=0;i<n+1;i++) *(q+i)=0;
	int s=0;
	while(p->next!=NULL){
		s=abs(p->next->data);
		if(*(q+s)==0){
			*(q+s)=1;
			p=p->next;
		}else{
			f=p->next;
			p->next=f->next;
			free(f);
			
		}
	}
	free(q);
}
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	deletesame(L,21);
	disp(L);
	return 0;
} 

删一段

//带头结点的单链表中删除给定值s-t之间的值
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[5]={2,3,5,1,6};
int n=5;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next =NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
void deletelist(linklist &L,int s,int t){
	lnode *pre=L,*p=pre->next;
	while(p){
		if(p->data>=s&&p->data<=t){
			pre->next=p->next;
			free(p);
			p=pre->next;
		}else{
			pre=p;
			p=p->next;
		}
	}
}
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	deletelist(L,1,3);
	disp(L);
	return 0;
} 

逆置

//逆序输出
//用的头插法
#include <bits/stdc++.h>
using namespace std;
int a[5]={2,3,5,4,3};
int n=5;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
void reverse(linklist &L){
	lnode *p=L->next,*r;//r指向p的后继防止断链
		L->next=NULL;
	while(p){
		r=p->next;
		p->next=L->next;
		L->next=p;
		p=r;		
	} 
}
int main(){
    linklist L;
	buildlist(L);
	disp(L);
	reverse(L);
	disp(L);	
	return 0;
} 

排序(直接插入排序)

//排序 直接插入排序
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[5]={2,1,3,5,4};
int n=5;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next ;
	}
	r->next=NULL;
} 
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
//排序函数
void sortlist(linklist &L){
	lnode *p=L->next,*r=p->next,*f;
	p->next=NULL;
	p=r;
	while(p){
		r=p->next;
		f=L;
		while(f->next!=NULL&&f->next->data<p->data) f=f->next;
		p->next=f->next;
		f->next=p;
		p=r;  		
	}
} 
int main(){
    linklist L;
	buildlist(L);
	disp(L);
	sortlist(L);
	disp(L);	
	return 0;
} 
 

找倒数第k个位置结点

//找倒数第K个位置的结点
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[5]={1,2,3,4,5};
int n=5;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
		
	}
	cout<<endl;
}
int findk(linklist L,int k){
	lnode *p=L->next,*q=L->next;//p工作指针
	int count= 0; 
	while(p){
		if(count<k) count++;
		else q=q->next;
		p=p->next;
	}
	if(count<k) return 0;
	else {
		cout<<"倒数第"<<k<<"个位置元素是"<<q->data<<" ";
		return 1;
	}
}
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	findk(L,4);
	return 0;
} 

找公共结点的起始位置

//找公共结点的起始位置//也就是找公共结点 
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	char data;
	struct lnode *next;
}lnode,*linklist;
char a[7]={'l','o','a','d','i','n','g'};
char b[5]={'b','e','i','n','g'};
int n1=7;
int n2=5;
void buildlist(linklist &L,char aa[],int n){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=aa[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
int length(linklist L){
	int k=0;
	lnode *s=L->next;
	while(s){
		k++;
		s=s->next;
	}
	return k;
}
linklist findfirst(linklist L1,linklist L2){
	lnode *p1=L1->next,*p2=L2->next;
	int len1=length(L1),len2=length(L2);
	int dist=abs(len1-len2);
	//先把多余的结点遍历完
	if(len1>len2){
		while(dist--){
			p1=p1->next;
		}
	} else if(len2>len1){
		while(dist--){
			p2=p2->next;
		}
	}
	//开始寻找 
    while(p1){
    	if(p1->data!=p2->data){
    		p1=p1->next;
    		p2=p2->next;
		}else return p1;
	}
	return p1;
}
int main(){
	linklist L1,L2;
	buildlist(L1,a,7);
	buildlist(L2,b,5);
	disp(L1);
	disp(L2);
	linklist ans=findfirst(L1,L2);
	cout<<ans->data<<endl;
	return 0;
}
 

在这里插入图片描述

找公共元素–存入原来的L1中

//找公共元素存于A中
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[5]={1,2,4,8,10};
int b[6]={2,3,4,6,10,11};
int n1=5;
int n2=6;
void buildlist(linklist &L,int aa[],int n){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=aa[i];
	    r->next=s;
	    r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
void findlist(linklist &L1,linklist &L2){
	lnode *p1=L1->next ,*p2=L2->next,*r,*f;
	L1->next=NULL;
	f=L1;
	while(p1&&p2){
		if(p1->data<p2->data) p1=p1->next;
		else if(p2->data<p1->data) p2=p2->next;
		else{
			r=p1->next;//防止断链
			p1->next =f->next;
			f->next=p1;
			f=p1;
			p1=r; 
		    	
		}
		f->next=NULL;
	}
}
int main(){
	linklist L1,L2;
	buildlist(L1,a,5);
	buildlist(L2,b,6);
	disp(L1);
	disp(L2);
	findlist(L1,L2);
	disp(L1);
	return 0;
} 

在这里插入图片描述

找公共元素–存入新链表L3中

//找公共元素建立新链表
#include<bits/stdc++.h> 
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[4]={1,2,3,4};
int b[5]={2,3,5,6,7};
int n1=4;
int n2=5;
void buildlist(linklist &L,int aa[],int n){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=aa[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s = L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next; 
	}
	cout<<endl;
}
linklist L3;
void buildnewlist(linklist L1,linklist L2){
	L3=(linklist)malloc(sizeof(lnode));
	lnode *p1=L1->next,*p2=L2->next,*r;
	r=L3;
	while(p1&&p2){
		if(p1->data<p2->data) p1=p1->next;
		else if(p1->data>p2->data) p2=p2->next;
		else{
			r->next=p1;
			r=p1;
			p1=p1->next;
			p2=p2->next;
		}
		
	}
	r->next=NULL;
}
int main(){
	linklist L1,L2;
	buildlist(L1,a,4);
	buildlist(L2,b,5);
	disp(L1);
	disp(L2);
	buildnewlist(L1,L2);
	disp(L3);
	return 0;
}

在这里插入图片描述

-----------------------------------

判断B是否是A的子序列

//判断B是否是A的子序列
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[11]={1,2,3,4,5,6,7,3,4,5,7};
int b[4]={3,4,5,7};
int n1=11,n2=4;
void buildlist(linklist &L,int aa[],int n){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=aa[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
bool isok(linklist L1,linklist L2){
	lnode *p1=L1->next ,*p2=L2->next,*r=L1->next;
	while(p1&&p2){
		if(p1->data!=p2->data){
			r=r->next;
			p1=r;
			p2=L2->next;//P2从头开始 
		}else{//相等的话就一一比较了 
			p1=p1->next;
			p2=p2->next;
		}
	} 
	if(p2!=NULL) return false;
	else return true; 
}
int main(){
	linklist L1,L2;
	buildlist(L1,a,11);
	buildlist(L2,b,4);
	disp(L1);
	disp(L2);
	if(isok(L1,L2)==true){
		cout<<"B是A的子序列"<<endl; 
	}else cout<<"匹配失败"<<endl; 
	return 0;
} 

合并链表递减

//合并链表递减,要求合并后的表再放在原来的表中
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[4]={1,3,4,6};
int b[2]={2,5};
int n1=4;
int n2=2;
void buildlist(linklist &L,int aa[],int n){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=aa[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
//开始合并 ,用的头插法 
void mergelist(linklist L1,linklist L2){
	lnode *p1=L1->next,*p2=L2->next,*r;
	L1->next =NULL;
	while(p1&&p2){
		if(p1->data<p2->data){
			r=p1->next;//防止断链
			p1->next=L1->next;
			L1->next=p1;
			p1=r; 
		}else{
			r=p2->next;
			p2->next=L1->next;
			L1->next=p2;
			p2=r;
		}
	}
	if(p1) p2=p1;//如果有链表非空 弄到p2上去 再把p2中的结点依次插入到新结点 
	while(p2){//因为最终的表在L1上 
		r=p2->next;
		p2->next=L1->next ;
		L1->next =p2;
		p2=r; 
	}
	free(L2);
} 
int main(){
	linklist L1,L2;
	buildlist(L1,a,4);
	buildlist(L2,b,2);
	disp(L1);
	disp(L2);
	mergelist(L1,L2);
	disp(L1); 
	return 0;
} 

链表重组

//链表重组{1,2,3,4,5,6,7,8}-->{1,8,2,7,3,6,4,5}
//{1,2,3,4,5,6,7,8}-->{1,2,3,4,8,7,6,5}-->{1,8,2,7,3,6,4,5}
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[8]={1,2,3,4,5,6,7,8};
int n=8;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
void newlist(linklist &L){
	lnode *p=L,*q=L,*r,*l; //p q 指向L 所以下面 
	while(p->next&&q->next){//p走1步,q走2步
	    p=p->next;
		q=q->next->next; 
	}
	q=p->next;
	p->next=NULL;
	//开始原地逆置后半段 用头插法
	while(q){
		r=q->next;
		q->next=p->next;
		p->next=q;
		q=r;
	} 
	//重组 
	l=L->next;
	q=p->next;
	p->next=NULL;
	while(q){
		r=q->next;
		q->next=l->next;
		l->next=q;
		l=q->next;
		q=r;
		
	} 
}
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	newlist(L);
	disp(L);
	return 0;
} 
 

切割

//分割链表
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[6]={1,2,3,4,5,6};
int n=6;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	} 
	cout<<endl;
}
linklist L2;//全局变量 
void cutlist(linklist &L1){
	L2=(linklist)malloc(sizeof(lnode));
	L2->next=NULL;
	lnode *r1=L1,*r2=L2,*p=L1->next;
	L1->next=NULL;
	int i=0;
	while(p){
		i++;
		if(i%2==0){
			r2->next=p;r2=p;
		} 
		else{
			r1->next=p;r1=p;
		} 
		p=p->next;
	}
	r1->next=NULL;
	r2->next=NULL;
}
int main(){
	linklist L1;
	buildlist(L1);
	disp(L1);
	cutlist(L1);
	disp(L1);
	disp(L2);
	
	return 0;
} 

连接两个循环单链表

//连接两个循环单链表
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[3]={1,2,3};
int b[3]={4,5,6};
int n1=3,n2=3;
void buildlist(linklist &L,int aa[],int n){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=aa[i];
		r->next=s;
		r=r->next;
	}
	r->next=L;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s!=L){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
//算法思想:找到两个尾指针 将第一个链表的尾指针与第二个链表的头指针连接
//将第二个链表的尾指针与第一个链表的头指针连接 保持循环形式
void newlist(linklist &L1,linklist &L2){
	lnode *p1=L1->next,*p2=L2->next;
	while(p1->next!=L1){
		p1=p1->next;
	}
	while(p2->next!=L2){
		p2=p2->next;
	}
	p1->next=L2->next;
	p2->next=L1;
}
int main(){
	linklist L1,L2;
	buildlist(L1,a,3);
	buildlist(L2,b,3);
	disp(L1);
	disp(L2);
	newlist(L1,L2);
	disp(L1);
	return 0;
} 

循环单链表中 依次删除最小值并输出

//循环单链表中 依次删除最小值并输出 
#include <bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next;
}lnode,*linklist;
int a[6]={5,4,6,8,1,3};
int n=6;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=L;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s!=L){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}

//算法思想:每循环一次 找到最小的结点 删除并输出
//直到链表为空 最后释放头结点
void deleteminlist(linklist &L){
	lnode *p=L->next,*pre=L,*minp=p,*minpre=pre;
	while(L->next!=L)//否则L空 
	{
       	p=L->next,pre=L,minp=p,minpre=pre;
		while(p!=L){
			if(p->data<minp->data){
				minp=p;
				minpre=pre;
			}else{
				pre=p;
				p=p->next;
			}
		} 
		//找到了后
		cout<<minp->data<<" ";
		minpre->next=minp->next;
		free(minp); 
	} 
	free(L);
} 
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	deleteminlist(L);
	return 0;
}

判断循环双链表是否对称

//判断循环双链表是否对称 
//算法思想:p指针从左向右遍历,q指针从右向左遍历
//当p q 指针指向相同结点或者相邻时结束
//若他们所指向的结点相同就继续比较 否则返回false
//如果比较全部相等 返回true
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data;
	struct lnode *next,*prior;
}lnode,*linklist;
int a[5]={1,2,3,2,1};
int n=5;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	L->next =L;
	L->prior=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		s->next=r->next;
		r->next->prior=s;
		s->prior=r;
		r->next=s;
		r=s;
		L->prior=s; 
		
	}
}
void disp(linklist L){
	lnode *s=L->next;
	while(s!=L){
		cout<<s->data<<" ";
		s=s->next;
		
	}
	cout<<endl;
}
//判断是否对称
bool isok(linklist L){
	lnode *p=L->next,*q=L->prior;
	while(p!=q&&q->next !=p){
		if(p->data==q->data){
			p=p->next;
			q=q->prior;
		}else return false;
	}
	return true;
} 
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	if(isok(L)==true) cout<<"对称"<<endl;
	else cout<<"不对称"<<endl; 
	return 0;
} 

非循环双链表 频率

//非循环双链表查找元素再排序,返回找到结点的地址
#include<bits/stdc++.h>
using namespace std;
typedef struct lnode{
	int data,f;
	struct lnode *next,*prior;
}lnode,*linklist;
int a[4]={1,2,3,4};
int n=4;
void buildlist(linklist &L){
	L=(linklist)malloc(sizeof(lnode));
	lnode *s,*r=L;
	L->prior=NULL;
	L->next=L;
	for(int i=0;i<n;i++){
		s=(lnode *)malloc(sizeof(lnode));
		s->data=a[i];
		s->f=0;
		s->next=r->next;
		r->next->prior=s;
		s->prior=r;
		r->next=s;
		r=s;
		
	}
	r->next =NULL;
}
void disp(linklist L){
	lnode *s=L->next;
	while(s){
		cout<<s->data<<" ";
		s=s->next;
	}
	cout<<endl;
}
//算法思想:此题主要考察双链表的查找、删除、插入
//先查找x,找到后频率设为1,再将x从原链表中断裂,通过比较频率将其插入合适的位置
linklist locate(linklist &L,int x){
	lnode *p=L->next,*q;
	while(p!=NULL&&p->data!=x) p=p->next;
	if(!p) cout<<"没有这个结点"<<endl;
	else {//找到了这个结点 
		p->f++;
	}
	//开始断链
	if(p->next!=NULL){
		p->next->prior=p->prior;
		p->prior->next=p->next;
	} 
	q=p->prior;
	while(q!=L&&q->f<p->f){
		q=q->prior;
		
	}
	p->next=q->next;
	q->next->prior=p;
	p->prior=q;
	q->next=p;
	
	return p;
}
int main(){
	linklist L;
	buildlist(L);
	disp(L);
	linklist ans=locate(L,3);
	cout<<ans->data<<endl;
	return 0;
}  

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值