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

    1:这里分为两种插入情况:一种是 插入位置在中间,另一种是插入位置在末尾。两种情况有一点不同:插入位置在中间时需要把p的原后继节点的前驱指针指向新插入的节点。

    // 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 =  pnode;
        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;
        }
    }
    
    
    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);
        return 0;
    }
    View Code

    运行结果:

  • 相关阅读:
    Windows网络编程:多线程技术
    Windows网络编程:OSI七层模型
    Windows网络编程:WinSock模型
    Windows网络编程:基于Scoket最简单的CS
    Windows网络编程:同步/异步 阻塞/非阻塞
    1.WebGL:简介
    无聊的面试啊:2020
    第一次面试
    实习第三周
    Eclipse新建web项目
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7603808.html
Copyright © 2011-2022 走看看