#include<iostream>
using namespace std;
#define NULL 0
struct node{
int data;
struct node *next;
};
node *p,*q,*s,*head;
void create( ){ //创建单链表
int x;
node *ptr;
head=(struct node*)malloc(sizeof(struct node));
head->next=NULL;
p=head;
cout<<"\nx=?";
cin>>x;
while(x!=0){ //以0为结束标志
ptr=(struct node*)malloc(sizeof(struct node));
ptr->data=x;
ptr->next=NULL;
p->next=ptr;
p=ptr;
cout<<"x=?";
cin>>x;
}
}
void pandan(node *h){ //判断单链表是否存在
if(h==NULL){
cout<<"单链表不存在!请创建单链表:";
create();
}
}
void outline(node *h){ //输出单链表
p=h->next;
while(p!=NULL)
{
cout<<"\ndata="<<p->data;
p=p->next;
}
cout<<"\n输出结束!\n";
}
void insert(node *h,int x,int y){ //在值为x的结点前插入枝y
s=(struct node*)malloc(sizeof(struct node));
s->data=y;
q=h;
p=h->next;
while(p!=NULL&&p->data!=x)
{
q=p;
p=p->next;
}
q->next=s;
s->next=p;
}
void Delete(node *h,int x){ //删除值为x的结点
q=h;
p=q->next;
while((p!=NULL)&&(p->data!=x)){
q=p;
p=p->next;
}
if(p==NULL)
cout<<"你输入的x不存在!";
else{
q->next=p->next;
free(p);
}
}
void countnode(node *h){ //输出单链表的长度
int length=0;
for(p=h;p->next!=NULL;p=p->next)
length++;
cout<<"单链表的长度为:length="<<length;
}
void found(node *h){ //找出结点所有值为X的序号
int x;
cout<<"请输入x:";
cin>>x;
int n=0;
while(h->next!=NULL){
n++;
if(h->next->data==x)
cout<<n<<" ";
h=h->next;
};
}
int main(){
int i,x,y,cord;
for(i=1;i>0;i++){
do{
cout<<" \n 主菜单 ";
cout<<" \n 1 建立单链表 ";
cout<<" \n 2 插入一个元素 ";
cout<<" \n 3 删除一个元素 ";
cout<<" \n 4 统计结点 ";
cout<<" \n 5 查找元素 ";
cout<<"\n-------------------------";
cout<<"\n 请输入你的选择(1,2,3,4,5,6)";
cin>>cord;
if(cord>6||cord<1) //判断输入的数字是否在1—6之间
cout<<"你的输入有误,请重新输入:";
if(cord>1&&cord<=6)
pandan(head); //判断单链表是否存在
switch(cord)
{
case 1:{ //创建单链表并输出
create();
outline(head);
}break;
case 2:{ //在值为x的结点前插入y
cout<<"请输入x:";
cin>>x;
cout<<"请输入y:";
cin>>y;
insert(head,x,y);
outline(head);
}break;
case 3:{ //删除值为x的结点
cout<<"请输入x:";
cin>>x;
Delete(head,x);
outline(head);
}break;
case 4:{ //输出单链表的长度
countnode(head);
}break;
case 5:{
found(head); //找出所有值为x的结点的序号
}break;
case 6:exit(0); //结束程序
}
}while(cord<=6&&cord>=1);
}
return 0;
}