#include<iostream>
using namespace std;

struct DulNode{
 int data;
 DulNode *prior;
 DulNode *next;
};

class DulLinkList{
   
private:
    DulNode *head;
 int n;
public:
 void inputNodeNumber();
 void createList();
 int listLength();
 bool listInsert(int i,int e);
 bool listDelete(int i);
 void display();
};

void DulLinkList::inputNodeNumber()
{
    printf("请输入双链表节点个数: \n");
 do
 {
     scanf("%d",n);
  if(n<=0) printf("不能创建该双链表,请重新输入:\n");
 }while(n<=0);
}

void DulLinkList::createList()
{
 int m;
 DulNode *L,*p,*s;

 L=new DulNode;
 L->data=n;
 L->prior=NULL;
 L->next=NULL;

 p=L;

 for(int i=1;i<=n;i++)
    {
  printf("请输入第i个结点的值:\n");
  scanf("%d",m);

  s=new DulNode;
  s->data=m;
  s->next=NULL;
  s->prior=p;
  p->next=s;
  p=s;
 }
 
 head=L;
}

int DulLinkList::listLength()
{
    return n;
}

bool DulLinkList::listInsert(int i,int e)
{
 int j=0;
 DulNode *p,*s;

 p=head;

 while(p!=NULL&&j<i-1) { p=p->next; j++;}

 if(p==NULL||j>i-1) { printf("插入位置错误\n"); return false; }

 s=new DulNode;
 s->data=e;
 s->next=p->next;
 s->prior=p;
 p->next=s;
 s->next->prior=s;

 head->data++;
 n++;

 return true;
}

bool DulLinkList::listDelete(int i)
{
 int j=0;
 DulNode *p,*temp;

 p=head;

 while(p!=NULL&&j<i-1) { p=p->next; j++; }

 if(p==NULL||j>i-1) { printf("删除位置错误"); return false; }

 temp=p->next;
 p->next=p->next->next;
 p->next->prior=p;
 delete temp;

 head->data--;
 n--;
 
 return true;

}

void DulLinkList::display()
{
 DulNode *p;
 p=head->next;
 printf("\n输出双链表\n");
 printf("链表包含如下结点:\n");
 for(int i=1;i<=n;i++)
 {
  printf("该结点的值为:d%",p->data);
  p=p->next;
 }
 printf("链表输出完毕\n\n");
}
    
int main()
{
 int n;
 int i,e;
 int choose=0;
 DulLinkList L;
 printf("\n创建双链表\n");
 L.inputNodeNumber();
 L.createList();
 printf("\n链表创建成功,输出如下:\n");

 L.display();
 
 while(choose!=3)
 {
  choose=0;
  printf("\n你可以对双链表进行的操作如下 :\n");
     printf("1. 插入\n2. 删除\n3. 退出\n");
     while(choose!=1&&choose!=2&&choose!=3)
  {
      printf("请输入 1 或 2 或 3:");
         scanf("d%",choose);
      if(choose!=1&&choose!=2&&choose!=3) printf("输入错误,请重新输入\n");
  }

     if(choose==1)
  {
      while(1)
   {
       printf("\n双链表插入前为:\n");
       L.display();
       printf("请输入要插入的数:");
          scanf("d%",e);
          printf("请输入要插入的位置:");
          scanf("d%",i);
       if(L.listInsert(i,e)) { printf("\n双链表插入后为:\n"); L.display(); break;}
       else printf("输入的插入位置错误,请重试\n");
   }
  }
     else if(choose==2)
  {
      while(1)
   {
       printf("\n双链表删除前为:\n");
       L.display();
       printf("请输入删除的结点的序号:");
          scanf("d%",i);
       if(L.listDelete(i)) {  printf("\n双链表删除后为:\n"); L.display(); break; }
       else printf("输入的结点序号错误,请重试\n");
   }
  }
     else if(choose==3)
  {
      printf("\n双链表最后为:\n");
      L.display();
      continue;
  }
 }
 return 0;
}