数据结构-编程实现一个双向链表节点的删除
1:代码如下:
// ConsoleApplication24.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<malloc.h>
#include <iostream>
#include <assert.h>
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
运行结果: