博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构-编程实现一个双向链表节点的删除
阅读量:4968 次
发布时间:2019-06-12

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

1:代码如下:

// ConsoleApplication24.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include
#include
#include
using namespace std;typedef struct DbNode //双向链表结构体{ int data;//节点数据 DbNode *left;//前驱节点指针 DbNode *right;//后继节点指针}DbNode;DbNode *CreateNode(int data)//创建一个节点,返回新创建的节点{ DbNode *pnode = (DbNode*)malloc(sizeof(DbNode)); pnode->data = data; pnode->left = pnode->right = pnode;//初始化的节点的前驱和后继都等于本身的地址 return pnode;}DbNode *CreateList(int head)//创建一个链表头,参数给出表头节点数据,表头节点不作为存放有意义数据的节点{ DbNode *pnode= (DbNode*)malloc(sizeof(DbNode)); pnode->data = head; pnode->left = NULL; pnode->right = NULL; return pnode;}/*插入新节点,总是在表尾插入;返回表头节点*/DbNode *AppendNode(DbNode *head, int data)//参数1是链表的表头节点,参数2是要插入的节点,其数据为data{ DbNode *node = CreateNode(data);//创建数据为data的新节点 DbNode *p = head, *q=NULL; while (p != NULL)//循环结束后,最后一个节点是q,p是q的right { q = p; p = p->right; } /*---在双向链表尾部插入新节点的方法---*/ q->right = node; node->left = q; node->right = NULL; /*---*/ return head; }void PrintList(DbNode *head)//打印整个链表{ DbNode *pnode = NULL; if (head == NULL)//链表为空 { return; } pnode = head; while (pnode != NULL) { printf("%d", pnode->data); pnode = pnode->right; } printf("\n");}int GetLength(DbNode *head)//双向链表的测长,参数为链表头节点{ int count = 1; DbNode *pnode = NULL; if (head==NULL)//head为NULL表示链表空 { return 0; } pnode = head->right; while (pnode != NULL) { pnode = pnode->right;//使用right指针遍历 count++; } return count;}/*查找节点,成功返回满足条件的节点指针,否则返回NULL*/DbNode *FindNode(DbNode *head, int data)//参数1是链表的头结点,参数2是要查找的节点,其数据为data{ DbNode *pnode = head; if (head == NULL)//head为NULL表示链表空 { return NULL; } /*找到数据或者到达链表末尾,推出while循环*/ while (pnode->right != NULL && pnode->data != data) { pnode = pnode->right;//使用right指针遍历 } //没有找到数据为data的节点,返回NULL if (pnode->right == NULL) { return NULL; } return pnode;}/*在node节点之后插入新节点*/void InserNode(DbNode *node, int data){ DbNode *newnode = CreateNode(data); DbNode *p = NULL; if (node == NULL)//node为NULL时返回NULL { return ; } if (node->right == NULL)//node为最后一个节点 { node->right = newnode; newnode->left = node; } else//node为中间节点 { newnode->right = node->right; node->right->left = newnode; node->right = newnode; newnode->left = node; }}/*删除满足指定条件的节点,返回表头节点,删除失败,返回NULL(失败的原因是不存在该节点)*/DbNode *DeleteNode(DbNode *head, int data)//参数1是链表的表头节点,参数2是要插入的节点,其数据为data{ DbNode *ptmp = NULL; DbNode *pnode = FindNode(head, data);//查找节点 if(pnode==NULL)//节点不存在,返回NULL { return NULL; } else if (pnode->left == NULL)//node为第一个节点 { head = pnode->right; if (head != NULL)//链表不为空 { head->left = NULL; } } else if (pnode->right == NULL)//node为最后一个节点 { pnode->left->right = NULL; } else { pnode->left->right = pnode->right; pnode->right->left = pnode->left; } free(pnode);//释放已被删除的节点空间 return head;}int main(){ /*---生成从0-9含有10个节点的循环链表---*/ DbNode *head = CreateList(0);//生成链表头 for (int i = 1; i < 10; i++) { head = AppendNode(head, i);//添加9个节点,数据为从1到9 } PrintList(head); cout << "找到数据为2的节点,地址为:" << FindNode(head, 2) << endl; cout << "数据为:" << FindNode(head, 2)->data << endl; InserNode(FindNode(head, 2), 666); cout << "在数据为2的节点后插入666:" << endl; PrintList(head); head = DeleteNode(head, 666); cout << "删除666后:" << endl; PrintList(head); return 0;}
View Code

运行结果:

转载于:https://www.cnblogs.com/lovemi93/p/7604021.html

你可能感兴趣的文章
转-linux误删文件恢复
查看>>
black box黑盒测试
查看>>
hdu 2457 DNA repair
查看>>
hdu 4427 Math Magic
查看>>
第八周作业
查看>>
react 返回上一页
查看>>
oracle闪回使用以及删除存储过程恢复
查看>>
Box2d引擎之元素
查看>>
JS屏蔽Flash右键菜单
查看>>
第三次作业 四则运算
查看>>
阿里2015实习生招聘在线测试----编程题,设计有限任务响应队列
查看>>
C# 判断字符串为空的4种方法及效率
查看>>
oracle 秒
查看>>
(转)setTextColor()的参数设置方式
查看>>
【常见Web应用安全问题】---4、Directory traversal
查看>>
重装了服务器,用的是centos/php微信小程序版,centos 命令大全
查看>>
敏感文件整理
查看>>
博客申请成功后第一天
查看>>
ubuntu 电源管理
查看>>
Json-Server模拟数据接口开发
查看>>