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

    运行结果:

  • 相关阅读:
    selenium+java利用AutoIT实现文件上传
    java+selenium自动化遇到confirm弹窗,出现NoAlertPresentException: no alert open
    Appium遇到问题:
    selenium2+java切换窗口
    nodejs
    连续12天的加班工作总结-根据客户选择来生成后续表单页面
    最近三家公司面试的总结吐槽及一点点总结
    nodeJs-autoMerge
    nodeJs-autoBulid
    Angular 学习笔记——ng-Resource1
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7603067.html
Copyright © 2011-2022 走看看