zoukankan      html  css  js  c++  java
  • 数据结构-编程实现一个双向链表节点的删除

    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("
    ");
    }
    
    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

    运行结果:

  • 相关阅读:
    软件测试:等价类划分——应用
    软件测试———白盒测试、黑盒测试与灰盒测试
    对软件项目管理的感想
    用maven进行项目管理
    my git ~
    ios支付宝的集成
    三个文本框的验证
    ios测试工具研究(1)-----------XCTest 单元测试
    等价类划分的思考
    git相关
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7604021.html
Copyright © 2011-2022 走看看