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;//初始化的节点的前驱和后继都等于本身的地址
        /*---测试---
        cout << "新创建节点的数据:"<<pnode->data << endl;
        cout << "新创建节点的地址:" << pnode << endl;
        cout << "新创建节点的前驱:" << pnode->left << endl;
        cout << "新创建节点的后继:" << pnode->right << endl;
        cout << "**********************************" << endl;
        ---*/
        return pnode;
    }
    
    DbNode *CreateList(int head)//创建一个链表头,参数给出表头节点数据,表头节点不作为存放有意义数据的节点
    {
        DbNode *pnode= (DbNode*)malloc(sizeof(DbNode));
        pnode->data = head;
        pnode->left =  pnode;
        pnode->right = NULL;
        /*---测试---
        cout << "链表头数据:" << pnode->data << endl;
        cout << "链表头的地址:" << pnode << endl;
        cout << "链表头的前驱:" << pnode->left << endl;
        cout << "链表头的后继:" << pnode->right << endl;
        cout << "**********************************" << endl;
        ---*/
    
        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;
        /*---*/
    
        /*---测试---
        cout << "新插入的数据:" << node->data << endl;
        cout << "新插入的地址:" << node << endl;
        cout << "新插入的前驱:" << node->left << endl;
        cout << "新插入的后继:" << node->right << endl;
        cout << "**********************************" << endl;
        ---*/
    
        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 main()
    {
        /*---生成从0-9含有10个节点的循环链表---*/
        DbNode *head = CreateList(0);//生成链表头
        for (int i = 1; i < 10; i++)
        {
            head = AppendNode(head, i);//添加9个节点,数据为从1到9
        }
        PrintList(head);
        return 0;
    }
    View Code

    运行结果:

    2:双链表的测长,代码如下:

    // 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;
    }
    
    
    
    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 << "链表的长度为:" << GetLength(head) << endl;
        return 0;
    }
    View Code

    运行结果:

  • 相关阅读:
    [Elasticsearch] 向已存在的索引中加入自己定义filter/analyzer
    Hibernate持久化对象的状态
    android 利用cmdline,将參数从preloader传递到kernel
    HDOJ的题目分类
    activiti自己定义流程之Spring整合activiti-modeler实例(七):任务列表展示
    十大广泛使用的Linux发行版
    Windows下配置Git服务器和客户端 超全
    适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )
    System.Drawing.Image在Save之后Type变了
    winform ListView应用之分组、重绘图标、网格线 (c# .net winform)
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7602844.html
Copyright © 2011-2022 走看看