2020-4-19-双向链表

双链表:

结点有两个指针:指向前驱的prior 指针, 指向后继的next指针

代码实现:

 

#include<iostream>using namespace std ;typedef int  datatype;typedef struct note{  datatype data;  struct note *next;  struct note * prior;}Dlink;/***************************************************************************************/Dlink *creat_Dlink();                                               /* 建立一个双链表    */int print_Dlink(Dlink *head) ;                                      /* 输出双链表   参数输入1为正向输出,或者是反向输出 */int get_Len(Dlink *head) ;                                     /* 求表长 */int get_data(Dlink * head, int i) ;                              /* 取元素操作 */int locate_data(Dlink *head,datatype e) ;                     /* 定位操作 */int delete_data(Dlink *head,int i)  ;                 /*删除操作 */int insert_data(Dlink *head,int i,datatype data) ;                     /*插入一个元素 *//**************************************************************************************/Dlink *creat_Dlink()                 /* 建立一个双链表    */{  Dlink  *head,*s,*p;  p=head=new Dlink;  //头结点  p 为零时结点  head->next=NULL;  head->prior=NULL;  datatype data;  //数据结点  cout<<"创建一个双向链表,请输入数据 默认是int ,以-1 结束"<<endl ;  while(cin>>data&& data!=-1)  {     s = new Dlink;     s->data=data;     s->prior=p;     p->next=s;     p=s;  }  p->next=NULL;  /* 如果将双链表,转换成双向循环链表  ,可以将下面代码注释去掉 */  /* p->next=head;     head->prior=p;  */  return (head);}int print_Dlink(Dlink *head,int i)             /* 输出双链表   参数输入1为正向输出,或者是反向输出 */{  Dlink *p;  p=head;  if (head->next ==NULL){    cout<<"空链表"<<endl ;    return 0 ;  }  if(i==1)  // 正向输出  {     while(p->next)   {      p=p->next;    cout<<p->data<<" ";   }    cout<<endl;  } else   //反向输出,先将指针移动到最后,然后利用prior 每次向前移动 {    while(p->next){  // 将指针移动到链表尾     p=p->next;   }    while(p!=head){        cout<<p->data<<" ";        p=p->prior;    }    cout<<endl; }  return  (1);}int get_Len(Dlink *head)        /* 求表长 */{  Dlink  *p;  int i=0;  p=head->next;  while(p)  {    i++;    p=p->next;  }  return (i);}int get_data(Dlink * head, int i)  /* 取i位置 元素操作 */{  int j;  Dlink *p;  int len =get_Len(head) ;  if(i<1 || i> len){    cout<<"获取元素失败 ,你输入的位置有误"<<endl ;    return (0);  }  p=head->next;  j=1;  while(p&&j<i)  {    p=p->next;    j++;  }   if(p==NULL){    return  0;   }   return  p->data;}int locate_data(Dlink *head,datatype e) /* 定位操作 */{  Dlink *p;  int i=1;  p=head->next;  while(p&&p->data!=e) //在链表中匹配与 e 相等的值  {    p=p->next;    i++;  }  if(p==NULL)  //到最后都没找打这个值  {    cout<<"链表中没有这个值 "<<endl;    return (0) ;  }  return (i);}int delete_data(Dlink *head,int i)     /*删除i位置元素操作 e ,返回删除位置元素*/{  Dlink *p,*s;  datatype e ;  int j;  int len =get_Len(head) ;  if(i<1 || i>len )  {    cout<<"你输入的位置有误"<<endl;    return (0);  }  p=head;  j=0;  while(p->next&&j<i-1) //将链表移动到i-1 位置  {    p=p->next;    j++;  }  if(p->next==NULL)  {    cout<<"你输入的位置超过表长"<<endl;    return (0);  }  s=p->next;  p->next=s->next;  if(s->next!=NULL){    s->next->prior=p;  }  e=s->data;  delete s;  return e ;}int insert_data(Dlink *head,int i,datatype data) /*在i位置插入一个元素data */{  Dlink *p,*s;  int j;  int len =get_Len(head) ;  if(i<1|| i>len)  {        cout<<"你输入的位置有误:"<<endl;        return (0);  }  p=head;  j=0;  while(p&&j<i-1) //移动到i -1 位置  {    p=p->next;    j++;  }  if(p==NULL)  {    cout<<"你输入的位置太大,超出链表的长度:"<<endl;    return (0);  }  s=new Dlink;  s->data=data;  s->next=p->next;  s->prior=p;  if(p->next!=NULL){    p->next->prior=s;  }  p->next=s;  return (1);}int main(){    Dlink *s,t;    s=&t;    s=creat_Dlink();//创建一个双向链表    cout<<"反向输出!"<<endl ;    print_Dlink(s,0);    cout<<"正向输出!"<<endl ;    print_Dlink(s,1);    cout<<"求链表长度"<<endl ;    cout<<get_Len(s)<<endl ;    cout<<"获取 4位置的元素"<<endl ;    cout<<get_data(s,4)<<endl ;    cout<<"定位元素操作 3在链表中的位置"<<endl ;    cout<<locate_data(s,3)<<endl ;    cout<<"删除1位置元素"<<endl ;    delete_data(s,1) ;    print_Dlink(s,1);    cout<<"插入操作"<<endl ;    insert_data(s,3,3);    print_Dlink(s,1);}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值