博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双向链表内结点的删除(4)
阅读量:6543 次
发布时间:2019-06-24

本文共 3210 字,大约阅读时间需要 10 分钟。

  hot3.png

情况有三:

  • 情况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;
struct dlist // 双向链表结构声明
{
int data; // 结点数据
struct dlist * front; // 指向下一结点的指针
struct dlist * back; // 指向前一结点的指针
};
typedef
struct dlist dnode; // 双向链表新类型
typedef dnode * dlink; // 双向链表指针新类型
/* -----使用数组值创建双向链表---- */
dlink createdlist(
int * array, int len)
{
dlink head;
// 双向链表的指针
dlink before; // 前一节点的指针
dlink new_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 < 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) // 是否有前结点
{
/* ----情况1:删除第一个结点---- */
head
= head -> front; // 指向下一个结点
head -> back = NULL; // 设置指向前结点的指针
}
else
{
if (ptr -> front == NULL) // 是否指向下一个结点
{
/* ---情况2:删除最后一个结点--- */
ptr
-> back -> front = NULL; // 前结点指向NULL
}
else
{
/* ----情况3:删除中间结点---- */
ptr
-> back -> front = ptr -> front; // 前结点指向下一结点
ptr -> front -> back = ptr -> back; // 下一结点指向前结点
}
}
free(ptr);
// 释放删除结点内存
return head; // 返回链表起始指针
}
/* -------------使用选项来移动结点后,删除目前的结点且将列出链表内容-------------- */
int main()
{
dlink head ;
// 双向链表指针
dlink now = 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 );
}
}
}

 

 

      

转载于:https://my.oschina.net/garyun/blog/602980

你可能感兴趣的文章
[LeetCode]Longest Increasing Path in a Matrix
查看>>
C++基础之适配器
查看>>
集合set-深入学习
查看>>
C#语言学习——面向对象的几大原则
查看>>
zk 常用资料整理(转)
查看>>
JavaScript 字符串操作
查看>>
Android中asset文件夹和raw文件夹区别
查看>>
Fuel 30 分钟快速安装openstack 分类: 软件插件学习 ...
查看>>
第二章家庭作业 2.78
查看>>
Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)
查看>>
<转>cookie和session的区别
查看>>
Risc-V指令集
查看>>
Python进阶04 函数的参数对应
查看>>
C语言结构体的“继承”
查看>>
c++ const修饰符 总结
查看>>
配置Tomcat的JVM的大小解决Tomcat内存溢出的问题
查看>>
WebView之禁止调用第三方浏览器
查看>>
POJ 3468 A Simple Problem with Integers(线段树 区间更新)
查看>>
华为MSTP负载均衡配置示例
查看>>
HTML5开源RPG游戏引擎lufylegendRPG 1.0.0发布
查看>>