数据结构-编程实现一个双链表的建立,双链表的打印,双链表的测长

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



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



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

运行结果:

posted @ 2017-09-27 17:17  一串字符串  阅读(396)  评论(0编辑  收藏  举报