#include<stdio.h>  
#include <stdlib.h>
struct Link
{
      int data;
      struct Link *next;
      
};
bool InsertNode(struct Link *ptr,int Loact);
struct Link *CreatLink(struct Link *ptr);
bool DleteNode(struct Link *pt,int i);
void Print(struct Link *p);
bool Find(struct Link *po,int fl);
                     
int  main() 
{
      int   ly,casey;
      struct Link *p=(struct Link *)malloc(sizeof(struct Link));
      char ch,t;
      printf ("是否对表数据进行操作?Y?N .\n");
      ch=getchar();
      t=getchar();
      while((ch=='y')||(ch=='Y'))
      {
            printf ("请选择你要操作的序号:       \n");
            printf ("****************************\n");
            printf ("      1、建立数据           \n");
            printf ("      2、插入元素           \n");
            printf ("      3、删除表中元素       \n");
            printf ("      4、查找元素           \n");
            printf ("      5、列出全部元素       \n");
            printf ("      6、退出程序           \n");
            printf ("****************************\n");
            scanf("%d",&casey);
            switch(casey)
            {
            case 1:
                  p=CreatLink(p);
                  break;
            case 2:
                  printf ("请输入你要插入的值的下标.\n");
                  scanf ("%d",&ly);
                  if(!InsertNode(p,ly))
                  {
                        printf("插入错误!!");
                  }
                  else
                  {
                        printf("插入元素成功\n");
                  }
                  break;
            case 3:
                  printf ("请输入你要删除值的下标\n");
                  scanf ("%d",&ly);
                  if(!DleteNode(p,ly))
                  {
                        printf("删除错误!!");
                  }
                   else
                  {
                        printf("删除元素成功\n");
                  }

                  break;
            case 4:
                  printf ("请输入你要查找值的下标\n");
                  scanf ("%d",&ly);
                  if(!Find(p,ly))
                  {
                        printf("查找错误!!");
                  }
                  break;
            case 5:
                  Print(p);
                  break;
            default:
                  exit(0);
            }
            printf ("是否对链表数据继续操作?Y?N.\n");
            ch=getchar();
            ch=getchar();
      }
      system("pause");
      return 0;
}
bool InsertNode(struct Link *ptr,int Locat)
{
      int i;
      struct Link *p;
      while(ptr&&i<Locat-1)
      {
            ptr=ptr->next;
            i++;
      }
      if(!ptr&&i>Locat-1)
            return false;
      else
      {
            p=(struct Link *)malloc(sizeof(struct Link));
            if(NULL==p)
            {
                  printf("分配内存失败!\n");
                  return false;
            }
            printf("请输入插入节点的数据\n");
            scanf("%d",&p->data);
            p->next=ptr->next;
            ptr->next=p;
            return true;
      }
} 
struct Link *CreatLink(struct Link *ptr)
{
      int len,cou;
      printf("输入头结点数据\n");
      scanf("%d",&ptr->data);
      struct Link *p,*h=ptr;
      printf("请输入你要建立链表的长度\n");
      scanf("%d",&len);
      for(cou=0; cou<len; cou++)
      {
            p=(struct Link *)malloc(sizeof(struct Link));
            printf("请输入第%d个数据\n",cou+1);
            scanf("%d",&p->data);
            if(NULL==p)
            {
                  printf("分配内存失败!");
                  exit(0);
            }
            ptr->next=p;
            ptr=p;
      }
      ptr->next=NULL;
      return h;
}
bool DleteNode(struct Link *pt,int i)
{
      struct Link *q;
      int  j=0;
      while (pt->next&&j<i-1)
      {
            pt=pt->next;
            j++;
      }
      if(j>i-1&&!(pt->next))
      {
            printf("输入的位置不合理");
            return false;
      }
      else
      {
            q=pt->next;
            pt->next=q->next;
            free(q);
            return true;
      }
      
}
void Print(struct Link *p)
{     
     int a;
     for(a=0;p;a++)
      {
            printf("第%d个元素是%d\n",a+1,p->data);
            p=p->next;
      }
}
bool Find(struct Link *po,int fl)
{
      int i=0;
      while(po->next&&i<fl)
      {
          i++;
          po=po->next;
      }
      if(i>fl-1&&!(po->next))
      {
            return false;
      }
      else
      {
            printf("查找的元素是%d\n",po->data);
            return true;
      }
}