结点定义
typedef struct DNode{
int data;
struct DNode *prior,*next;
struct DNode *r;
}DNode,*DLinklist;
初始化
bool InitDLinkList(DLinklist &L){
L=(DNode*)malloc(sizeof(DNode));
if(L==NULL){
return false;
}
L->prior=NULL;
L->next=NULL;
return true;
}
求长度
int Length(DLinklist L){
int len=0;
DNode *p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
判断是否为空
bool Empty(DLinklist &L){
if(L->next==NULL){
printf("双链表为NULL!\n");
return true;
}else{
printf("双链表不为NULL,长度为:%d\n",Length(L));
return false;
}
}
双链表创建
头插法(倒序)
DLinklist DList_HeadInsert(DLinklist &L){
printf("头插法构建双链表:(以空格间隔、9999结束)\n");
DNode *s;
int x;
L=(DLinklist)malloc(sizeof(DNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(DNode*)malloc(sizeof(DNode));
s->data=x;
if(L->next==NULL){
L->next=s;
s->prior=L;
s->next=NULL;
L->r=s;
} else{
s->next=L->next;
s->next->prior=s;
L->next=s;
s->prior=L;
}
scanf("%d",&x);
}
return L;
}
尾插法(顺序)
DLinklist DList_TailInsert(DLinklist &L){
printf("尾插法构建双链表:(以空格间隔、9999结束)\n");
int x;
L=(DLinklist)malloc(sizeof(DNode));
L->next=NULL;
DNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(DNode*)malloc(sizeof(DNode));
s->data=x;
r->next=s;
s->prior=r;
r=s;
scanf("%d",&x);
}
r->next=NULL;
L->r=r;
return L;
}
插入
指定结点前插入
bool InsertPriorNode(DNode *p,DNode *s){
if(p==NULL||s==NULL){
return false;
}
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
}
指定结点后插入
bool InsertNextDNode(DNode *p,DNode *s){
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;
}
遍历
从前往后
void Head_PrintList(DLinklist &L){
printf("【从前向后遍历】\n");
DNode *p;
p=L->next;
while(p!=NULL){
printf("%d\n",p->data);
p=p->next;
}
}
从后往前
void Tail_PrintList(DLinklist &L){
printf("【从后向前遍历】\n");
DNode *p;
p=L->r;
while(p!=L){
printf("%d\n",p->data);
p=p->prior;
}
}
删除结点
bool DeleteNextDNode(DNode *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;
}
销毁双链表
void DestoryList(DLinklist &L){
printf("DestoryList");
while(L->next!=NULL){
DeleteNextDNode(L);
}
free(L);
L=NULL;
printf("双链表已销毁!");
}
完整代码及运行结果
代码
#include<stdlib.h>
#include<stdio.h>
typedef struct DNode{
int data;
struct DNode *prior,*next;
struct DNode *r;
}DNode,*DLinklist;
bool InitDLinkList(DLinklist &L){
L=(DNode*)malloc(sizeof(DNode));
if(L==NULL){
return false;
}
L->prior=NULL;
L->next=NULL;
return true;
}
int Length(DLinklist L){
int len=0;
DNode *p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
bool Empty(DLinklist &L){
if(L->next==NULL){
printf("双链表为NULL!\n");
return true;
}else{
printf("双链表不为NULL,长度为:%d\n",Length(L));
return false;
}
}
DLinklist DList_HeadInsert(DLinklist &L){
printf("头插法构建双链表:(以空格间隔、9999结束)\n");
DNode *s;
int x;
L=(DLinklist)malloc(sizeof(DNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(DNode*)malloc(sizeof(DNode));
s->data=x;
if(L->next==NULL){
L->next=s;
s->prior=L;
s->next=NULL;
L->r=s;
} else{
s->next=L->next;
s->next->prior=s;
L->next=s;
s->prior=L;
}
scanf("%d",&x);
}
return L;
}
DLinklist DList_TailInsert(DLinklist &L){
printf("尾插法构建双链表:(以空格间隔、9999结束)\n");
int x;
L=(DLinklist)malloc(sizeof(DNode));
L->next=NULL;
DNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(DNode*)malloc(sizeof(DNode));
s->data=x;
r->next=s;
s->prior=r;
r=s;
scanf("%d",&x);
}
r->next=NULL;
L->r=r;
return L;
}
bool InsertNextDNode(DNode *p,DNode *s){
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;
}
bool InsertPriorNode(DNode *p,DNode *s){
if(p==NULL||s==NULL){
return false;
}
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
}
bool DeleteNextDNode(DNode *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;
}
void DestoryList(DLinklist &L){
printf("DestoryList");
while(L->next!=NULL){
DeleteNextDNode(L);
}
free(L);
L=NULL;
printf("双链表已销毁!");
}
void Tail_PrintList(DLinklist &L){
printf("【从后向前遍历】\n");
DNode *p;
p=L->r;
while(p!=L){
printf("%d\n",p->data);
p=p->prior;
}
}
void Head_PrintList(DLinklist &L){
printf("【从前向后遍历】\n");
DNode *p;
p=L->next;
while(p!=NULL){
printf("%d\n",p->data);
p=p->next;
}
}
int main(){
DLinklist L1,L2;
InitDLinkList(L1);
Empty(L1);
DList_HeadInsert(L1);
Empty(L1);
Head_PrintList(L1);
Tail_PrintList(L1);
DList_TailInsert(L2);
Empty(L2);
Head_PrintList(L2);
Tail_PrintList(L2);
DestoryList(L2);
}
运行结果
双链表为NULL!
头插法构建双链表:(以空格间隔、9999结束)
1 2 3 4 5 6 9999
双链表不为NULL,长度为:6
【从前向后遍历】
6
5
4
3
2
1
【从后向前遍历】
1
2
3
4
5
6
尾插法构建双链表:(以空格间隔、9999结束)
1 2 3 4 5 6 9999
双链表不为NULL,长度为:6
【从前向后遍历】
1
2
3
4
5
6
【从后向前遍历】
6
5
4
3
2
1
DestoryList双链表已销毁!
|