线性表——循环链表/双向链表

2.2循环链表

比单链表多了个尾指针,指向头结点

2.2.1循环链表的合并

LinkList   merge(LinkList LA, LinkList LB) {
  p=LA; q=LB;
  while(p->next!=LA)  p=p->next; /*找到表LA的表尾*/
  while(q->next!=LB)  q=q->next; //找到表LB的表尾
  p->next=LB->next;   //表LA的尾指针指向LB首元结点
  q->next=LA;   //LB尾结点指向LA头结点
  free(LB); 
  return(LA);
}

若想用O(1)的时间复杂度合并两个单链表成为一个循环链表,可采用尾指针

2.3双向链表

每个结点都比单链表多了一个prior域

2.3.1定义

typedef struct DNode {
     ElemType  data;
     struct DNode *prior,*next;
} DNode,*DoubleList;

2.3.2插入

2.3.2.1前插:将结点s插在结点p之前

s->prior=p->prior;

s->next=p;

p->prior->next=s;

p->prior=s;

注意先操作s结点的prior和next域,否则会改变p结点的指向,造成混乱

2.3.2.2后插:将结点s插在结点p之后

 s->prior=p;

s->next=p->next;

p->next=s;

s->next->prior=s;

写法不唯一,但要注意某结点指向一旦改变后,后续再利用此结点指向时,避免混乱

int DlinkIns(DoubleList L,int i,ElemType e){
   p=L; j=0;          
   while(p->next!=L&&j<i-1)  { p=p->next; j++; }//找到第i-1个结点做插入操作

   s=(DNode*)malloc(sizeof(DNode));

   if(s){ s->data=e;  
     s->next=p->next; s->prior=p; 
     p->next=s; s->next->prior=s; return TRUE; } 
   else return FALSE;
}

 2.3.3删除

删除p结点

p->prior->next=p->next;

p->next->prior=p->prior;

int DlinkDel(DoubleList L,int i,ElemType *e) {
   p=L; j=0;
   while(p->next!=L&&j<i)  { p=p->next; j++; }//找到第i个元素对应的p结点

   *e=p->data;
   p->prior->next=p->next;
   p->next->prior=p->prior;
   free(p); return TRUE;
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值