单链表汇总
#include <iostream>
#include <cstdlib>
using namespace std;
struct node
{
int data;
node *next;
}*head,*p,*r;
void get(node *head,int i)
{
int j;
p=head->next;
j=1;
while((p!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if((p!=NULL)&&(j==i))
cout<<"已找到您要的结点数据:"<<endl<<p->data<<endl<<endl;
else
cout<<"i not exsit!"<<endl<<endl;
}
void insert(node *head,int i,int x)
{
node *s;
int j;
p=head;
j=0;
while((p!=NULL)&&(j<i-1))
{
p=p->next;
j++;
}
if(p==NULL)
cout<<"no this position!"<<endl;
else
{
s=new node;
s->data=x;
s->next=p->next;
p->next=s;
cout<<"已插入"<<endl<<endl;
}
}
void deletes(node *head,int i)
{
node *p,*s;
int j;
p=head;
j=0;
while((p->next!=NULL)&&(j<i-1))
{
p=p->next;
j++;
}
if(p->next==NULL)
cout<<"no this position"<<endl<<endl;
else
{
s=p->next;
p->next=p->next->next;
cout<<"已删除"<<endl<<endl;
free(s);
}
}
int len(node *head)
{
int n=0;
p=head;
while(p!=NULL)
{
n++;
p=p->next;
}
return n-1;
}
void searchfirst(node *head,int x)
{
p=head->next;
while((p->data!=x)&&(p->next!=NULL))
p=p->next;
if(p->data==x)
p->data=0-p->data;
else
cout<<"no found!"<<endl;
}
void searchall(node *head,int x)
{
p=head->next;
int n=0;
while(p->next!=NULL)
{
if(p->data==x)
n++;
p=p->next;
}
if(p->data==x)
n++;
if(n!=0)
cout<<n<<"个满足条件"<<endl;
else
cout<<"no found!"<<endl;
}
int x;
int main()
{
cout<<"//----------------------//"<<endl;
cout<<"请输入链表数据,输入-1结束"<<endl;
cout<<"//----------------------//"<<endl;
cin>>x;
head=new node;
head->next=NULL;
r=head;
while(x!=-1)
{
p=new node;
p->data=x;
p->next=NULL;
r->next=p;
r=p;
cin>>x;
}
p=head->next;
int q=1;
cout<<endl<<endl<<endl;
while(q!=0)
{
cout<<"输入任意非0数继续操作"<<endl;
cout<<"输入0结束操作"<<endl;
cin>>q;
if(q==0)
break;
cout<<"-------------------------------"<<endl;
cout<<"输入1查询结点"<<endl;
cout<<"输入2插入结点"<<endl;
cout<<"输入3删除结点"<<endl;
cout<<"输入4查询长度"<<endl;
cout<<"输入5查找第一个=x的结点进行取反"<<endl;
cout<<"输入6查找所有=x的结点个数"<<endl;
cout<<"-------------------------------"<<endl;
cout<<"输入0打印当前链表"<<endl;
cout<<"-------------------------------"<<endl;
int choose;
cin>>choose;
switch(choose)
{
case 1:
{
cout<<"请输入您要查询的结点编号:"<<endl;
cin>>x;
get(head,x);
continue;
}
case 2:
{
cout<<"请输入您要插入的结点编号:"<<endl;
int i;
cin>>i;
cout<<"请输入新"<<i<<"结点的数据:"<<endl;
cin>>x;
insert(head,i,x);
continue;
}
case 3:
{
cout<<"请输入您要删除的结点编号:"<<endl;
cin>>x;
deletes(head,x);
continue;
}
case 4:
{
cout<<"当前单链表长度为:"<<len(head)<<endl<<endl;
continue;
}
case 5:
{
cout<<"输入x:"<<endl;
cin>>x;
searchfirst(head,x);
cout<<"已完成"<<endl;
continue;
}
case 6:
{
cout<<"输入x:"<<endl;
cin>>x;
searchall(head,x);
cout<<"已完成"<<endl;
continue;
}
case 0:
{
cout<<"当前链表为:"<<endl;
p=head->next;
while(p->next!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data<<endl;
continue;
}
}
}
cout<<"//-操作已结束-//"<<endl<<endl<<endl<<endl;
cout<<"//------------//"<<endl;
cout<<"是否要打印链表?"<<endl;
cout<<"输入:1打印,2结束"<<endl;
cout<<"//------------//"<<endl;
cin>>q;
if(q==1)
{
p=head->next;
cout<<"链表打印中,请稍等……"<<endl;
while(p->next!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data<<endl;
}
cout<<"已结束"<<endl<<"关闭";
system("pause");
return 0;
}