关于单链表的一些基本操作
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
#define OVERFLOW -2
#define ERROR -1
#define SUCCESS 0
typedef int Elem;
typedef struct lnode{
Elem data;
struct lnode *next;
}Lnode,*Linklist;
void ListCreate(Linklist &l){
Linklist lnew,t;
t=l=new Lnode;
l->next=NULL;
int i=20;
Elem e;
e=rand()%101+1;
while(i--){
lnew=new Lnode;
lnew->data=e;
lnew->next=NULL;
l->next=lnew;
e=rand()%101+1;
l=l->next;
}
l=t;
return;
}
void deletelist(Linklist &l){
Linklist t;
l=l->next;
while(l){
t=l;
l=l->next;
delete t;
}
}
void trverseL(Linklist &l){
Linklist t=l;
l=l->next;
while(l!=NULL){
cout<<" "<<l->data;
l=l->next;
}
cout<<endl;
l=t;
return;
}
void reversalL(Linklist l){
Linklist p,q,t;
t=l;
l=l->next;
p=NULL;
while(l){
q=l->next;
l->next=p;
p=l;
l=q;
}
t->next=p;
l=t;
}
void deletevenL(Linklist &l){
Linklist p,q,t=l;
p=l->next;
while(p!=NULL){
if(p->data%2==0){
q=p;
l->next=p->next;
p=p->next;
delete q;
}
else{
p=p->next;
l=l->next;
}
}
l=t;
return ;
}
void insertL(Linklist &l,Elem e){
Linklist p,q,t=l;
p=l->next;
while(p){
if(p->data>=e){
q=new Lnode;
q->data=e;
q->next=p;
l->next=q;
l=t;
return ;
}
p=p->next;
l=l->next;
}
q=new Lnode;
q->data=e;
q->next=NULL;
l->next=q;
l=t;
return;
}
void mergel(){
Linklist p,q,l,t;
p=new Lnode;
p->next=NULL;
q=new Lnode;
q->next=NULL;
l=new Lnode;
l->next=NULL;
for(int i=0;i<20;i++){ //
insertL(p,rand()%101+1);
insertL(q,rand()%101+1);
}
cout<<"第一个链表建立输出:";
trverseL(p);
cout<<"第二个链表建立输出:";
trverseL(q);
t=q;
q=q->next;
delete t;
while(q){
insertL(l,q->data);
t=q;
q=q->next;
delete t;
}
t=p;
p=p->next;
delete t;
while(p){
insertL(l,p->data);
t=p;
p=p->next;
delete t;
}
cout<<"合并成非递减链表:";
trverseL(l);
reversalL(l);
cout<<"合并成非递增链表:";
trverseL(l);
deletelist(l);
return ;
}
void seprateL(){
Linklist l,p,q,p1,q1;
p=new Lnode;
p1=p;
p->next=NULL;
q=new Lnode;
q1=q;
q->next=NULL;
cout<<"建立一个新的链表: ";
ListCreate(l); //create new linklist
trverseL(l);
l=l->next;
while(l){
if(l->data%2==0){
p->next=l;
l=l->next;
p=p->next;
p->next=NULL;
}
else{
q->next=l;
l=l->next;
q=q->next;
q->next=NULL;
}
}
cout<<"拆分成两个链表: "<<endl;
cout<<"拆分的第一链表: ";
trverseL(p1);
cout<<"拆分的第二链表: ";
trverseL(q1);
return ;
}
void TEST(){
int tsnum;
cout<<"本次实验进行链表的有关操作:"<<endl;
cout<<"输入1测试产生链表并遍历操作"<<endl;
cout<<"输入2测试逆转链表并遍历操作"<<endl;
cout<<"输入3测试删除偶数并遍历操作"<<endl;
cout<<"输入4测试合并链表并遍历操作"<<endl;
cout<<"输入5测试拆分链表并遍历操作"<<endl;
cout<<"输入其他数字跳出测试循环"<<endl;
while(1){
cout<<"请输入:";
cin>>tsnum;
cout<<endl;
switch(tsnum){
case 1:{
Linklist l;
cout<<"建立新的链表,并输出:";
ListCreate(l);
trverseL(l);
deletelist(l);
cout<<endl;
}break;
case 2:{
Linklist l;
cout<<"建立新的链表,并输出:";
ListCreate(l);
trverseL(l);
cout<<"逆转链表并输出:";
reversalL(l);
trverseL(l);
deletelist(l);
cout<<endl;
}break;
case 3:{
Linklist l;
cout<<"建立新的链表,并输出:";
ListCreate(l);
trverseL(l);
cout<<"删除偶数结点并输出:";
deletevenL(l);
trverseL(l);
deletelist(l);
cout<<endl;
};break;
case 4:{
mergel();
cout<<endl;
}break;
case 5:{
seprateL();
cout<<endl;
}break;
default :return ;break;
}
cout<<"继续测试";
}
return ;
}
int main(){
srand(time(0));
TEST();
return 0;
}