嵌入式 双向链表节点的删除的问题

情况有三:

  • 情况1:删除链表的第一个结点

           (1) 将指向链表开始的指针head指向第二个结点.

            (2)此时原链表的第二个结点将成为新链表的开始,并且将新链表开始结点的指针back设为NULL.

  • 情况2:删除最后一个结点

            将原链表的最后一个结点之前一个结点的指针from设为NULL.

  • 情况3:删除链表内中间结点

            (1)将链表内指针ptr所指结点的前一个结点指针front指向指针ptr所指结点的下一个结点.

           (2) 将链表内指针ptr所指结点的最后一个指针back指向指针ptr所指结点的前一个结点.

 

双向链表内结点删除
复制代码
#include"iostream"
#include
"stdlib.h"
using namespace std;


structdlist //双向链表结构声明

{
int data; //结点数据

struct dlist *front;//指向下一结点的指针
struct dlist *back;//指向前一结点的指针
};
typedef
structdlist dnode; //双向链表新类型

typedefdnode *dlink; //双向链表指针新类型




dlink createdlist(
int*array,int len)
{

dlink head;
//双向链表的指针

dlinkbefore; //前一节点的指针
dlinknew_node; //新结点的指针
int i;




head
=(dlink)malloc(sizeof (dnode));
if(!head)//检查内存指针

return NULL;
head
->data=array[0];//创建结点内容

head->front=NULL;//设置指针初值
head->back=NULL;//设置指针初值
before=head;//指向第一个结点


for(i=1;i <</SPAN>len;i++)//用循环创建其他结点
{


new_node
=(dlink)malloc(sizeof(dnode));
if(!
new_node)
return
NULL;
new_node
->data=array[i];//创建结点内容

new_node->front=NULL;
new_node
->back=before;//将新结点指向前结点

before->front=new_node; //新结点成为前结点
before=new_node;

}
return
head;
}



void freedlist( dlink head)
{
dlink ptr;
//存储目前结点指针

while(head!=NULL)//链表遍历循环
{
ptr
=head; //保留目前结点指针

head=head->front; //指向下一个结点
free(ptr); //释放目前结点内存
}

}



void printdlist( dlink head,dlink now)
{
while(head!=NULL)//链表遍历循环

{
if(head==now)//输出目前结点数据

printf("#%d#",head->data); //输出结点数据
else
printf(
"[%d]",head->data); //输出结点数据
head=head->front; //指向下一个结点
}
printf(
"\n"
);
}



dlink deletenode(dlink head,dlink ptr)
{
if(ptr->back==NULL)//是否有前结点
{

head
=head->front; //指向下一个结点
head->back=NULL;//设置指向前结点的指针
}
else

{
if(ptr->front==NULL)//是否指向下一个结点
{


ptr
->back->front=NULL;//前结点指向NULL

}
else
{

ptr
->back->front=ptr->front; //前结点指向下一结点
ptr->front->back=ptr->back; //下一结点指向前结点
}
}
free(ptr);
//释放删除结点内存

return head; //返回链表起始指针
}


int main()
{
dlink head ;
//双向链表指针

dlinknow=NULL; //目前结点指针
int list[6]={1,2,3,4,5,6};
int select; //选择项1~4

head=createdlist(list,6);
if(head==
NULL)
{
printf(
"内存分配失败!n"
);
exit(
1
);
}

while(1
)
{
if(now==
NULL)

now
=head; //目前指向第一结点

printf("链表内容是:");
printdlist(head,now);

printf(
"[1]往下移动 [2]往回移动 [3]删除结点 [4]离开 ==>");
scanf(
"%d",&
select);
switch
(select)
{

case 1:if(now->front!=NULL)
now
=now->front; //指向下一结点

else
printf(
"在链表结尾\n");
break
;


case 2:if(now->back!=NULL)
now
=now->back; //指向前一结点

else
printf(
"在链表开始\n");
break
;



case 3:if(head!=NULL)
{
head
=
deletenode(head,now);
now
=head; //目前指向第一结点


}
else
printf(
"链表是空的\n");
break
;

case 4:freedlist(head);
exit(
1
);
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值