线性表之双链表(C++/C)
注:双链表带头结点
声明:
#include
#include
//双链表 带头节点
#define ElemType int
typedef struct DNode{
ElemType data;
struct DNode*prior,*next;
}DNode,*DLinkList;
//初始化双链表 bool InitDLink(DLinkList &L)
//双链表的插入 //将节点s插入到p节点之后 bool InsertNextDNode(DNode *p,DNode *s)
//双链表的删除 //删除p节点的后继节点 bool DeleteNextDNode(DNode *p)
//销毁链表 void DestroyList(DLinkList &L)
void DLinkListShow(DLinkList L)
//给链表赋值 void InitDLinkListWithData(DLinkList &L,ElemType a[],ElemType size)
//初始化双链表
bool InitDLink(DLinkList &L){
L=(DNode*)malloc(sizeof(DNode));
if (L==NULL)
return false;
L->prior=NULL;
L->next=NULL;
return true;
}
//双链表的插入
//将节点s插入到p节点之后
bool InsertNextDNode(DNode *p,DNode *s){
if (p==NULL||s==NULL)
return false;
s->next=p->next;
//将节点s插入到p节点之后
if (p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
//双链表的删除
//删除p节点的后继节点
bool DeleteNextDNode(DNode *p){
if (p==NULL) return false;
DNode *q=p->next; //找到p节点的后继节点q
if (q==NULL) return false; //p没有后继节点
p->next=q->next;
if (q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
//销毁链表
void DestroyList(DLinkList &L){
//循环释放各个数据节点
while (L->next!=NULL)
DeleteNextDNode(L);
free(L); //释放头结点
L=NULL; //头指针指向NULL
}
//给链表赋值
void InitDLinkListWithData(DLinkList &L,ElemType a[],ElemType size){
for (int i = 0; i data=a[i];
InsertNextDNode(L,s);
}
}
void DLinkListShow(DLinkList L){
if (!L){
printf("The DLinkList is Null !\n");
} else
{
printf("The data of the LinkList are\n");
DNode *p=L->next;
while (p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
}
int main(){
DLinkList L;
ElemType a[]={1,3,5,7};
InitDLink(L);
InitDLinkListWithData(L,a,4);
DLinkListShow(L);
DestroyList(L);
DLinkListShow(L);
return 0;
}
#include
#include
//双链表 带头节点
#define ElemType int
typedef struct DNode{
ElemType data;
struct DNode*prior,*next;
}DNode,*DLinkList;
//初始化双链表
bool InitDLink(DLinkList &L){
L=(DNode*)malloc(sizeof(DNode));
if (L==NULL)
return false;
L->prior=NULL;
L->next=NULL;
return true;
}
//双链表的插入
//将节点s插入到p节点之后
bool InsertNextDNode(DNode *p,DNode *s){
if (p==NULL||s==NULL)
return false;
s->next=p->next;
//将节点s插入到p节点之后
if (p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
//双链表的删除
//删除p节点的后继节点
bool DeleteNextDNode(DNode *p){
if (p==NULL) return false;
DNode *q=p->next; //找到p节点的后继节点q
if (q==NULL) return false; //p没有后继节点
p->next=q->next;
if (q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
//销毁链表
void DestroyList(DLinkList &L){
//循环释放各个数据节点
while (L->next!=NULL)
DeleteNextDNode(L);
free(L); //释放头结点
L=NULL; //头指针指向NULL
}
//给链表赋值
void InitDLinkListWithData(DLinkList &L,ElemType a[],ElemType size){
for (int i = 0; i data=a[i];
InsertNextDNode(L,s);
}
}
void DLinkListShow(DLinkList L){
if (!L){
printf("The DLinkList is Null !\n");
} else
{
printf("The data of the LinkList are\n");
DNode *p=L->next;
while (p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
}
int main(){
DLinkList L;
ElemType a[]={1,3,5,7};
InitDLink(L);
InitDLinkListWithData(L,a,4);
DLinkListShow(L);
DestroyList(L);
DLinkListShow(L);
return 0;
}