数据结构-编程实现一个双向链表的查找

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

/*查找节点,成功返回满足条件的节点指针,否则返回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;
}

运行结果:

时间: 2024-12-12 02:52:07

数据结构-编程实现一个双向链表的查找的相关文章

数据结构-编程实现一个双向链表节点的插入

1:这里分为两种插入情况:一种是 插入位置在中间,另一种是插入位置在末尾.两种情况有一点不同:插入位置在中间时需要把p的原后继节点的前驱指针指向新插入的节点. // ConsoleApplication24.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std;

数据结构-编程实现一个双向链表节点的删除

1:代码如下: // ConsoleApplication24.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std; typedef struct DbNode //双向链表结构体 { int data;//节点数据 DbNode *left;//前驱节点指针

数据结构-编程实现一个单链表节点的删除

1:代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;//节点内容 node *next;//指向结构体的指针,下一个节点 }node; node *create()

数据结构-编程实现一个单链表节点的插入

1:向链表中某个位置(第pos个节点)之后插入节点,这里分别插入到链表首部.插入到链表中间,以及链表尾端3个位置.代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;/

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

1:双链表的建立,打印,代码如下: // ConsoleApplication24.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std; typedef struct DbNode //双向链表结构体 { int data;//节点数据 DbNode *lef

数据结构-编程实现一个单链表的打印

1:首先参考别人的单链表的创建及打印,代码如下: #include "stdafx.h" #include<stdio.h> #include<malloc.h> typedef struct LNode { int data; struct LNode *next; }LNode; /*上面只是定义了一个结构体类型,并未实际分配内存空间 只有定义了变量才分配内存空间*/ LNode *creat(int n) { int i; LNode *head, *p1

数据结构-编程实现一个单链表的测长

1:代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> typedef struct node//定义链表结构体 { int data;//节点内容 node *next;//指向结构体的指针,下一个节点 }node; node *create()//创建单链表 { int i = 0;//链表中数据的个数 node *head, *p,

【编程题目】把二元查找树转变成排序的双向链表(树)

1.把二元查找树转变成排序的双向链表(树)题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14 / \ / \ 4 8 12 16转换成双向链表4=6=8=10=12=14=16.首先我们定义的二元查找树 节点的数据结构如下:struct BSTreeNode{int m_nValue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTree

创建一个双向链表数据结构

这是书上的一道练习题,要求创建一个双向链表数据结构Ring,它是一个环形的结构,Ring必须支持从当前位置单步地前进或回退. add方法在当前元素之后添加元素,支持使用for-each.任何因环空而导致的无效操作,Ring类支持抛出适当的异常. 此外,不能继承LinkedList,也就是说只能自己单写一个. 解题的思路很简单,既然LinkedList就满意要求,那么再做一个LinkedList就可以了. 直接拿LinkedList源码来分析. 首先LinkedList创建了一个内部结点类:Nod