循环链表和双向链表
一、 带尾指针的循环链表的合并
算法步骤:
- p存表头结点——p=Ta->next;
- Tb表头连接到Ta表尾——Ta->next=Tb->next->next;
- 释放Tb表头结点——delate Tb->next;
- 修改指针——Tb->next=p;
LinkList Connect(LinkList Ta,LinkList Tb){p=Ta->next; //p存表头结点Ta->next=Tb->next->next; //Tb表头连接Ta表尾delete Tb->next; //释放Tb表头结点Tb->next=p; //修改指针return Tb;
}
二、 双向链表
结构定义如下:
typedef struct DuLNode{Elemtype data;struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;
prior | data | next |
双向链表结点结构
三、 双向循环链表
和单链的循环表类似,双向链表也可以有循环表
- 让头结点的前驱指针指向链表的最后一个结点
- 让最后一个结点的后继指针指向头结点
四、 双向链表的删除
void ListDelete_DuL(DuLink &L,int i,ElemType &e){//删除带头结点的双向循环链表L的第i个元素,并用e带回if(!(p=GetElemP_DuL(L,i))) return ERROR;e=p->data;p->piror->next=p->next;p->next->prior=p->prior;free(p);return OK;
}