数据结构:双链表
由于双链表中大部分操作其实和单链表操作类似,所以这里只挑关键的一些函数
1、定义与初始化
typedef struct DNode
{
ElementType data;
struct DNode *prior,*next;
}DNode,*DLinkList;
bool InitialDLinkList(DLinkList &L){
L = (DNode *)malloc(sizeof(DNode));
if (L==NULL)
{
return false;
}
L->prior = NULL;
L->next = NULL;
return true;
}
2、在某结点添加和删除后继结点
bool InsertNextDNode(DNode *p,DNode *s){//在p结点添加后继结点
if (p==NULL||s==NULL)
{
return false;
}
s->next = p->next;
if (p->next!=NULL)
{
p->next->prior=s;
}
s->prior = p;
p->next = s;
return true;
}
bool DeletNextDNode(DNode *p){//删除p的后继结点
if(p==NULL) return false;
DNode *q = p->next;
if (q==NULL) return false;
p->next = q->next;
if (q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
3、摧毁整个双链表
oid DestroyDLinkList(DLinkList &L){
while (L->next!=NULL)
{
DeletNextDNode(L);
}
free(L);
L=NULL;
}
4、打印链表,包括打印整个链表,和从某个结点开始前向或者后向打印
void print(DLinkList &L){
DNode *p = L->next;
while(p->next!=NULL){
printf("%d",p->data);
p=p->next;
}
}
void print_next(DNode *p){
while(p->next!=NULL){
printf("%d",p->data);
p=p->next;
}
}
void print_prior(DNode *p){
while(p->prior!=NULL){
printf("%d",p->data);
p=p->prior;
}
}