链表
#include<iostream.h>
struct LNode
{
int data;
LNode *next;
};
void InsertRear(LNode *&HL,const int &item)
{
LNode *newptr;
newptr=new LNode;
newptr->data=item;
newptr->next=NULL;
if(HL==NULL)
HL=newptr;
else{
LNode *p=HL;
while(p->next!=NULL)
p=p->next;
p->next=newptr;
}
}
void InitList(LNode *&HL,int n)
{
LNode *p1,*q;
HL=p1=new LNode;
for(int i=0;i<n;i++)
{
q=new LNode;
cin>>q->data;
HL->next=q;
HL=q;
}
HL->next=NULL;
HL=p1->next;
}
void InitList2(LNode *&HL,int n)
{
HL=NULL;
int num;
for(int i=0;i<n;i++)
{
cin>>num;
InsertRear(HL,num);
}
}
void TraverseList(LNode *&HL)
{
LNode *p=HL;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void CopyLink(LNode *&a,LNode *&b)//实现把a链表拷贝到b链表
{
b=NULL;
LNode *p=a;
while(p!=NULL)
{
InsertRear(b,p->data);
p=p->next;
}
}
int delnum(LNode *&HL,int pos)
{
int num=1;
LNode *ap,*cp;
ap=NULL;cp=HL;
while(cp!=NULL)
{
if (num==pos) break;
ap=cp;
cp=cp->next;
num++;
}
if(cp==NULL)
HL=HL->next;
else
ap->next=cp->next;
delete cp;
return 1;
}
void DeSort(LNode *&HL)
{
if(HL==NULL) return;
LNode *p=HL->next;
LNode *pr=NULL;
while (p!=NULL)
{
HL->next=pr;
pr=HL;
HL=p;
p=p->next;
}
HL->next=pr;
}
void FindMax(LNode *&HL)
{
LNode *p=HL;
int max;
max=p->data;
while(p!=NULL)
{
if(max<(p->data)) max=p->data;
p=p->next;
}
cout<<"最大的数是"<<max<<endl;
}
void LnodeNum(LNode *&HL,int x)//统计出单链表中的值等于x的个数
{
int count=0;
LNode *p=HL;
while(p!=NULL)
{
if (x==p->data) count++;
p=p->next;
}
cout<<"X的个数是"<<count<<"个"<<endl;
}
int LnodeNum(LNode *&HL)//求出结点个数
{
int count=0;
LNode *p=HL;
while(p!=NULL)
{
count++;
p=p->next;
}
return count;
}
void copy(LNode *&HL)
{
int i=0;
LNode *p=HL;
int size=LnodeNum(HL);
int *List;
List=new int[size];
while(p!=NULL)
{
List[i]=p->data;
i++;
p=p->next;
}
cout<<"size="<<size<<endl;
for (i=0;i<size;i++)
{
cout<<List[i]<<" "<<endl;
}
}
void sort(LNode *HL)//链表用冒泡法
{
int temp;
LNode *p=HL;
while(p!=NULL)
{
LNode *q=p->next;
while (q!=NULL)
{
if(p->data>=q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
q=q->next;
}
delete q;
p=p->next;
}
}
void add(LNode *&a,LNode *&b)
{
LNode *p1=a;
while(p1->next!=NULL) //要想清楚,这里是p1->next,而不是p1.很容易出错。
{
p1=p1->next;
}
p1->next=b;
}
void addsort(LNode *&a,LNode *&b)//第七题,b链表覆盖了a链表
{
add(a,b);
sort(a);
}
void addsort2(LNode *&a,LNode *&b,LNode *&c)//第八题,产生派序后放在新的链表
{
CopyLink(a,c);
add(c,b);
sort(c);
}
void Devide(LNode *&c,LNode *&d,LNode *&e)
{
LNode *p;
d=e=NULL;
p=c;
while(p!=NULL)
{
if(p->data%2==0) InsertRear(d,p->data);
else InsertRear(e,p->data);
p=p->next;
}
}
void main()
{
LNode *a;
int num,i;
cout<<"请准备输入的原始数据的个数"<<endl;
cin>>num;
cout<<"********************************"<<endl;
cout<<"请准备输入的原始数据"<<endl;
InitList2(a,num);
cout<<"初始数据输入完毕"<<endl;
TraverseList(a);
while(1)
{
cout<<"请选择你要的操作"<<endl;
cout<<"1:逆序链接原链表:"<<endl;
cout<<"2:删除第i个结点"<<endl;
cout<<"3:找出最大值"<<endl;
cout<<"4:统计出单链表中的值等于x的个数"<<endl;
cout<<"5:根据一维数组建立一个对应的链表"<<endl;
cout<<"6:对一个链表排序"<<endl;
cout<<"7:把两个链表合成一个,并且排序,并且清空原来的链表"<<endl;
cout<<"8:把两个链表合成一个,并且排序,放在新链表里面"<<endl;
cout<<"9:把一个链表中的偶数和奇数分别放在两个新链表中:"<<endl;
cout<<"10:遍历链表:"<<endl;
cin>>i;
while(i<1||i>10)
{
cout<<"请输入你的选择(1~10):";
cin>>i;
}
cout<<endl;
switch(i)
{
case 1:
cout<<"逆序链接"<<endl;
DeSort(a);
break;
case 2:
cout<<"请输入要删除的第i个结点"<<endl;
int x;
cin>>x;
delnum(a,x);
break;
case 3:
cout<<"找出最大值"<<endl;
FindMax(a);
break;
case 4:
cout<<"请输入要统计的数是什么"<<endl;
int y;
cin>>y;
LnodeNum(a,y);
case 5:
cout<<"根据一维数组建立一个对应的链表"<<endl;
break;
case 6:
cout<<"链表排序"<<endl;
sort(a);
break;
case 7:
cout<<"请输入另外两个链表中的第一个的个数"<<endl;
LNode *b;
int num1;
cin>>num1;
InitList(b,num1);
cout<<"请输入另外两个链表中的第二个的个数"<<endl;
LNode *c;
int num2;
cin>>num2;
InitList(c,num2);
addsort(b,c);
TraverseList(b);
break;
case 8:
cout<<"请输入另外两个链表中的第一个的个数"<<endl;
LNode *d;
int num3;
cin>>num3;
InitList(d,num3);
cout<<"请输入另外两个链表中的第二个的个数"<<endl;
LNode *e;
int num4;
cin>>num4;
InitList(e,num4);
LNode *f;
addsort2(d,e,f);
TraverseList(f);
break;
case 9:
LNode *g,*h;
Devide(a,g,h);
cout<<"偶数是"<<endl;
TraverseList(g);
cout<<"奇数是"<<endl;
TraverseList(h);
break;
case 10:
TraverseList(a);
break;
}
}
}
浙公网安备 33010602011771号