`
chinrui
  • 浏览: 97590 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

双向链表的实现

阅读更多
#include <iostream>
#include <stdlib.h>

using namespace std;

typedef int Elemtype;
typedef struct lNode {
    Elemtype data;
    struct lNode *prior;
    struct lNode *next;
} *LinkedList;

//函数声明
LinkedList initNode();
void showNodesInClockwise(LinkedList);
void showNodesInAnticlockwise(LinkedList);
void initLinkedList(LinkedList , int);
int getLength(LinkedList);

int main()
{
    LinkedList lHead = initNode();
    lHead->next = lHead;
    lHead->prior = lHead;
    cout << "输入要建立链表的长度:" << endl;
    int length;
    cin >> length;
    cout << "输入要建立链表的数据值,共" << length << "个数 :" << endl;
    initLinkedList(lHead , length);

    //测试插入
    void insertNode(LinkedList , int , Elemtype);
    int iInsertIndex;
    cout << "请输入要插入的地址:" << endl;
    cin >> iInsertIndex;
    Elemtype eInsertValue;
    cout << "请输入要插入的值:" << endl;
    cin >> eInsertValue;
    insertNode(lHead , iInsertIndex , eInsertValue);

    //测试删除
    /*LinkedList deleteNode(LinkedList , int);
    int iDeleteIndex;
    cout << "请输入要删除的地址值,不小于1,不大于" << getLength(lHead) << ":" << endl;
    cin >> iDeleteIndex;
    lHead = deleteNode(lHead , iDeleteIndex);*/

    //测试修改
    /*void modifyNode(LinkedList , int , Elemtype);
    cout << "输入要更新结点的地址值,不小于1,不大于" << getLength(lHead) << ":" << endl;
    int iModifyIndex;
    cin >> iModifyIndex;
    cout << "输入要更新的结点值:" << endl;
    Elemtype iModifyValue;
    cin >> iModifyValue;
    modifyNode(lHead , iModifyIndex , iModifyValue);*/

    //测试查找
    /*Elemtype searchNode(LinkedList , int);
    Elemtype eSearchResult;
    cout << "输入要查找的结点的地址值:" << endl;
    int iSearchIndex;
    cin >> iSearchIndex;
    eSearchResult = searchNode(lHead , iSearchIndex);
    cout << "链表中地址值为" << iSearchIndex << "的结点值为:" << endl;
    cout << eSearchResult << endl;*/


    cout << "顺序输出链表里面的结点值:" << endl;
    showNodesInClockwise(lHead);
    //cout << "逆序输出链表里面的值:" << endl;
    //showNodesInAnticlockwise(lHead);

    //获得链表长度测试
    //cout << getLength(lHead) << endl;
    return 0;
}

//初始化结点
LinkedList initNode() {
    return (LinkedList)malloc(sizeof(lNode));
}

//链表展示
void showNodesInClockwise(LinkedList head) {
    cout << head->data << " ";
    LinkedList lCurr = head->next;
    while(lCurr != head) {
        cout << lCurr->data << " ";
        lCurr = lCurr->next;
    }
    cout << endl;
}

void showNodesInAnticlockwise(LinkedList head) {
    LinkedList lCurr = head->prior;
    while(lCurr != head) {
        cout << lCurr->data << " ";
        lCurr = lCurr->prior;
    }
    cout << head->data << endl;
}

//尾插法初始化链表
void initLinkedList(LinkedList head , int iSize) {
    LinkedList lCurr = head;
    cin >> lCurr->data;
    for(int i = 1; i < iSize; i++) {
        LinkedList lNew = initNode();
        cin >> lNew->data;
        lNew->next = head;
        head->prior = lNew;
        lCurr->next = lNew;
        lNew->prior = lCurr;
        lCurr = lNew;
    }
}

int getLength(LinkedList head) {
    int length = 1;
    LinkedList lCurr = head->next;
    while(lCurr != head) {
        length++;
        lCurr = lCurr->next;
    }
    return length;
}

//向链表中插入相应的数据
void insertNode(LinkedList head , int index , Elemtype value) {
    LinkedList lCurr = head;
    //判断插入地址的合法性
    if(index <= 0 || index > getLength(head) + 1) {
        cout << "插入的地址不存在!" << endl;
        return;
    }
    //移动到要插入的位置
    for(int i = 1; i < index; i++) {
        lCurr = lCurr->next;
    }
    //生成新的结点并插入
    LinkedList lNew = initNode();
    lNew->data = value;
    lNew->prior = lCurr->prior;
    lCurr->prior->next = lNew;
    lNew->next = lCurr;
    lCurr->prior = lNew;
}

//删除链表中的元素
LinkedList deleteNode(LinkedList head , int index) {
    LinkedList lResult = head;
    LinkedList lCurr = head;
    //判断插入地址的合法性
    if(index <= 0 || index > getLength(head)) {
        cout << "要删除的地址不存在!" << endl;
        return lResult;
    }
    //移动到要插入的位置
    for(int i = 1; i < index; i++) {
        lCurr = lCurr->next;
    }
    lCurr->prior->next = lCurr->next;
    lCurr->next->prior = lCurr->prior;
    lResult = lCurr->next;
    free(lCurr);
    return lResult;
}

//修改链表中的结点值
void modifyNode(LinkedList head , int index , Elemtype value) {
    //判断插入地址的合法性
    if(index <= 0 || index > getLength(head)) {
        cout << "要修改的地址不存在!" << endl;
        return;
    }
    //移动到要插入的位置
    for(int i = 1; i < index; i++) {
        head = head->next;
    }
    head->data = value;
}

//查找结点值
Elemtype searchNode(LinkedList head , int index) {
    //判断插入地址的合法性
    if(index <= 0 || index > getLength(head)) {
        cout << "查找的结点不存在!" << endl;
        return -1;
    }
    //移动到要插入的位置
    for(int i = 1; i < index; i++) {
        head = head->next;
    }
    return head->data;
}
分享到:
评论

相关推荐

    C++的双向链表实现

    **C++的双向链表实现** 在C++中,双向链表是一种数据结构,它包含节点,每个节点都有指向其前一个节点和后一个节点的指针。这使得在链表中的导航比单链表更加灵活,因为可以向前或向后移动。双向链表在许多算法和...

    用双向链表实现电话簿管理

    用双向链表实现电话簿管理。具有加入、删除、显示、修改和查询联系人电话号码的功能。

    双向链表实现的AOI

    在游戏开发、虚拟环境模拟和实时三维应用中,AOI(Area of Interest...综上所述,通过双向链表实现的AOI系统为大规模实体的范围检测提供了高效且灵活的解决方案,支持动态半径和场景变化,是场景管理中的一个重要工具。

    Java基于双向链表实现双端队列结构(算法源码)

    * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected ...

    用单链表和双向链表实现的航空订票系统

    航空订票系统是使用单链表和双向链表实现的,旨在提供便捷的航空订票服务。该系统支持查询航线、客票预订和办理退票等业务活动。 系统设计 航空订票系统的设计主要包括以下几个方面: 1. 航空订票系统的功能模块...

    c#版的双向链表实现

    总结,C#版的双向链表实现涉及到泛型、接口和类设计等多个核心编程概念。通过这些工具,我们可以创建一个灵活、高效且可复用的数据结构,以满足各种程序需求。在实际开发中,理解和掌握这些概念对于提升代码质量至关...

    双向链表实现贪吃蛇游戏(C语言版)

    在本文中,我们将深入探讨如何使用C语言和双向链表实现经典的贪吃蛇游戏。双向链表是一种数据结构,它允许我们在列表中的任何位置轻松地插入和删除元素,这使得它成为实现动态游戏世界,如贪吃蛇,的理想选择。 1. ...

    C实现的双向链表,欢迎使用

    而“list”可能是实现双向链表的源代码文件,通过查看和分析这些代码,可以加深对双向链表实现的理解。 总之,掌握C语言实现的双向链表对于理解数据结构和算法至关重要,它能够帮助我们编写更高效、灵活的程序。...

    双向链表实现

    双向链表实现,C语言双向链表,数据结构实现

    数据结构 用双向链表实现约瑟夫环

    数据结构大作业,c++用双向链表实现约瑟夫环,内含.h与.cpp

    双向链表实现结点类

    定义、实现并测试一个双向链表结点类DNode。 链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* ...

    双向链表实现约瑟夫环

    已知N个人(以编号1,2,3...n分别表示)围成一个圈。 从编号为K的人开始报数,数到M的那个人出列,他的下一个人又从1开始报数,依照此规律重复下去,直到圆圈中的人全部出列。 问题:请打印出这N个的...双向链表实现的

    建立双向链表实现对双向链表的插入删除操作1参考.pdf

    建立双向链表实现对双向链表的插入删除操作 在计算机科学中,链表是一种常用的数据结构,它可以用来存储和管理大量的数据。链表的优点是可以动态地增加或删除节点,从而实现对数据的灵活管理。在本文中,我们将介绍...

    C++ 双向链表实现学生管理系统

    C++ 双向链表实现学生管理系统

    双向链表实现工资管理

    排序插入,更具数据查找结点及修改结点数据等功能,链表根据姓名排序 根据姓名查找记录时支持通配符*和?,即*通配任意字符和字符串,?通配一个字符,字符不分大小。 将工资管理以文件的形式存在磁盘上,每次操作时...

    C语言通讯录(双向链表实现).zip

    本项目"**C语言通讯录(双向链表实现)**"是利用C语言实现了一个通讯录系统,该系统的核心数据结构是双向链表。双向链表是一种线性数据结构,它不同于单链表,每个节点不仅包含数据,还包含两个指针,一个指向前一个...

    双向链表实现多项式加法和乘法.cpp

    双向链表实现多项式加法和乘法

    用双向链表做的n的阶乘

    由于是用链表实现,我们可以在每个节点中存储一个乘积,从1开始,每次迭代都将当前值乘以n并减少n,直到n减到1为止。每个新的乘积会成为链表中的新节点。这样,链表的长度就等于阶乘的阶数,最后一个节点的值就是n的...

    C++双向链表统计文章单词出现频率

    在这个特定的项目中,“C++双向链表统计文章单词出现频率”是一个涉及数据结构和算法的应用,目标是实现一个程序来分析文本文件,计算并显示文章中每个单词出现的次数。双向链表作为数据结构的核心,其特点是每个...

Global site tag (gtag.js) - Google Analytics