情况有三:
- 情况1:删除链表的第一个结点
- 情况2:删除最后一个结点
- 情况3:删除链表内中间结点
![嵌入式 <wbr>双向链表节点的删除的问题](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![嵌入式 <wbr>双向链表节点的删除的问题](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
#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;
}
returnhead;
}
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);
}
}
}
#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;
}
returnhead;
}
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);
}
}
}