删除带头结点的单链表中所有值为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
#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;
}
删绝对值
#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;
}
删一段
#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;
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个位置结点
#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;
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中
#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的子序列
#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;
}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;
while(p2){
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;
}
链表重组
#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;
while(p->next&&q->next){
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)
{
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;
}
判断循环双链表是否对称
#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;
}
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;
}