双链表操作

单链表的基础上加了一个prior指针,指向前驱节点。

prior前驱指针data数据域next后驱指针

双链表中节点类型:

typedef struct DLNode{
	int data;
	struct DLNode *prior,*next;
}DLNode,*DLinklist;

初始化双链表
 


 bool InitDlinklist(DLinklist &L){
 	L=(DLinklist)malloc(sizeof(DLNode));
 	if(L==NULL){
 		return false;
	 	//TODO
	 }
 	L->next=NULL;
 	L->prior=NULL;
 	return true;
 }

前插法建立双链表

DLinklist DList_Head(DLinklist &L){
	int x;
	DLNode *s;
	scanf("%d",&x);
	while(x!=999){
		s=(DLNode*)malloc(sizeof(DLNode));
		s->data=x;
		s->next=L->next;
		s->prior=L;
		if(L->next!=NULL){
			L->next->prior=s;
			//TODO
		}
		L->next=s;
		scanf("%d",&x);
		//TODO
	}
	return L;
} 

尾插法建立双链表

DLinklist DList_Tail(DLinklist &L){
	int x;
	DLNode *s,*r;
	s,r=L;
	scanf("%d",&x);
	while(x!=999){
		s=(DLNode*)malloc(sizeof(DLNode));
		s->data=x;
		r->next=s;
		s->prior=r;
		r=s;
		scanf("%d",&x);
		//TODO
	}
	r->next=NULL;
	return L;
}

给定节点后插入

 bool InsertNextNode(DLinklist &L,DLNode *p,int e){
     DLNode *s =(DLNode*)malloc(sizeof(DLNode));
    if(s==NULL){
        return false;
        //TODO
    } 
    DLNode *q=p->next;
    s->data=e;
    if(p->next!=NULL){
        q->prior=s;
        //TODO
    }
    s->prior=q->prior;
    s->next=p->next;
    p->next=s;
    return true;
 }

删除p的后继节点

bool DeleteNextNode(DLNode *p,int &e){
 	if(p==NULL){
 		return false;
	 	//TODO
	 }
 	if(p->next==NULL){
 		return false;
	 	//TODO
	 }
 	DLNode *q=p->next;
 	p->next=q->next;
 	if(q->next!=NULL){
 		q->next->prior=p;
	 	//TODO
	 }
	 e=q->data;
	 free(q);
	 return true;
 	} 

遍历双链表

     DLNode *p=L;
	 DLNode *r;
	 //后向遍历
	 while(p->next!=NULL){
	 	p=p->next;
	 	//TODO
	 }
	 //前向遍历
	 while(r!=NULL){
	 	r=r->prior;
	 	//TODO
	 }
	 //跳过头节点的遍历
	 while(r->prior!=NULL){
	 	r=r->prior;
	 	//TODO
	 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值