双向链表

双向链表结点的定义如下:

typedef struct DLnode

{

DataType  data;

struct  DLnode *prior,*next;

}DLNode,*DLinkList;

在双向链表中,若p为指向表中某一结点的指针,则显然有:

p->next->prior=p->prior->next=p;

在双向链表中,对于只需要设计一个方向的指针操作,如Get_DLinkList,Location_DLinkList等,算法操作与单链表相同,但在插入,删除时有很大不同,这时 需要改变两个方向上的指针。

下面展示了在p指向的结点之后插入新节点s的操作,执行语句如下:

s->next=p-next;

p->next->prior=s;

s->prior=p;

p->next=s;

下面展示在p指向的节点之后删除其后继结点的操作:

DLinkList q=p->next;

p->next=q->next;

q->next->prior=p;

free(q);

 双向循环链表的插入运算和删除运算如下:           

void Insert_DLinkList(DLinkList L,int i,DataType x)
{
	DLNode *p,*s;
	p=Get_DLinkList(L,i-1);
	if(p==L)
	{
		printf("插入位置不合法");
		exit(1); 
	}
	else
	{
		s=(DLinkList)malloc(sizeof(DLNode));
		s->data=x;
		s->next=p->next;
		p->next->prior=s;
		s->prior=p;
		p->next;
	}
 } 
 
 void Delete_DLinkList(DLinkList L,int i)
 {
 	DLNode *p,*q;
 	p=Get_DLinkList(L,i-1);
 	if(p==NULL)
 	{
 		printf("删除位置不合法");
 		//第i个结点的前驱结点不存在,不能执行删除操作
		 exit(1); 
	 }
	 else
	 {
	 	if(p->next==L){
	 		printf("删除位置不合法");
			 // 第i个结点不存在,不能执行删除操作
			 exit(1); 
		 }
		 else{
		 	p->next=q->next;
		 	q->next->prior=p;
		 	free(q);
		 }
	 }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值