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

原创 2013年12月02日 14:38:47

情况有三:

  • 情况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
);
}
}
}

C语言实现双向链表删除节点、插入节点、双向输出等操作

#include #include typedef struct DoubleLinkedList { int data; struct DoubleLinkedList *pre; ...
  • shihui512
  • shihui512
  • 2013年07月31日 15:26
  • 3334

Java双向链表的创建结点,清空链表,添加结点,删除结点

这里给出双向链表的基本操作说明,当然这里只是给出了一个统一的实现模板思路,具体问题还要具体分析。后序还会给出链表的一些应用实例。 package javaList; import java.util....
  • qq_30507287
  • qq_30507287
  • 2016年06月30日 21:05
  • 1107

双向链表(2) - 删除节点

在双向链表中删除一个指定的节点,可以分为下面的这3种情况: (a) 原始的双向链表 (b) 删除头节点后 (c) 删除中间节点后 (d) 删除尾节点后 算法 假设需要被删除的节点称...
  • shltsh
  • shltsh
  • 2015年06月14日 00:29
  • 2499

嵌入式 双向链表实现视频预录(hi3518c)

prerecord.h typedef struct joseph_prerecord  {   char *ipnc_frame_buf[25];  int ipnc_frame_buf_size[...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:57
  • 1174

嵌入式C语言那点事(三)Linux中霸道的双向链表源码与应用

C语言作为面向过程的语言,想写出灵活的结构与封装需要很高技巧。 但由于C语言的高效,几乎所有操作系统和面向对象语言的最底层实现都使用了C语言。即,使用C完成面向对象的封装。 这次通过整理与仿写Li...
  • PirateLeo
  • PirateLeo
  • 2012年05月19日 15:29
  • 2308

关于双向链表插入节点的问题

Status ListInsert(DuLinkList L, int i, ElemType e) {         DuLinkList p;         DuLNode *s; //...
  • wfdtxz
  • wfdtxz
  • 2012年09月05日 10:38
  • 2784

关于c语言中删除单向链表节点的问题

二话不说先上代码,这是摘自网上的一段代码,用以解读题目所说的问题。// 假设h为指向链表头结点指针,那么head就是指向h指针的指针 void delete(node ** head) { f...
  • THEANARKH
  • THEANARKH
  • 2017年07月29日 02:57
  • 176

关于递归删除链表节点为什么不会断链问题解释

问题的由来:    当你第一次实现用递归实现链表删除功能的时候,是否有一丝丝的考虑过。这个问题呢?为什么对于非递归版本的删除必须要知道当前要删除节点的前驱,而需要对其前驱节点的next域指针进行修改。...
  • u010016150
  • u010016150
  • 2015年06月22日 13:27
  • 2310

java建立双向链表,插入结点,删除节点

java建立双向链表,插入结点,删除节点
  • qyy333
  • qyy333
  • 2013年10月27日 23:17
  • 1962

双向链表的建立、删除/插入节点

实现代码如下(C++):
  • KobeBryant0313
  • KobeBryant0313
  • 2014年05月07日 16:37
  • 458
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 双向链表节点的删除的问题
举报原因:
原因补充:

(最多只允许输入30个字)