关闭

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

399人阅读 评论(0) 收藏 举报
分类:

情况有三:

  • 情况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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1045654次
    • 积分:18263
    • 等级:
    • 排名:第522名
    • 原创:741篇
    • 转载:523篇
    • 译文:0篇
    • 评论:105条
    最新评论