IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 双向链表的创建以及增删改查 -> 正文阅读

[数据结构与算法]双向链表的创建以及增删改查

作者:recommend-item-box type_blog clearfix

实现起来其实不难,于是我把代码做了优化,模仿了stm32的库函数哈哈哈,便于理解和修改。不足之处请指出

#include "stdio.h"
#include "stdlib.h"

//宏定义
#define ElementType int
#define uint unsigned int

ElementType pa[6] = {1, 2, 2, 3, 5, 7};
ElementType pb[5] = {2, 3, 4, 6, 8};
ElementType *pc;
uint MaxLength1 = 6;
uint MaxLength2 = 5;
uint structLength = 0;

//结构体定义
typedef struct Node
{
    ElementType data;
    struct Node *next;
    struct Node *prior;
} LNode, *LinkList;

//标记作用的结构体定义
LinkList presentNode; //当前指向的结构体
LinkList headNode;    //头结点
LinkList finalNode;   //指向最后一个结构体

//运行是否成功标志位定义
uint FLAG;

//函数声明
//一级函数
void structInit(LNode *pNode);                               //结构体初始化
void printfStructData(LinkList pNode, uint nowStructLength); //打印链表数据
//增:
void structInsert(LNode *pNode, ElementType insertLocation, uint insertData); //在指定位置插入
void structInsertArray(LinkList pNode, ElementType *pData, uint dataLength);  //在末尾插入数组
//删
void deleteStructElement(LinkList pNode, uint deleteLocation);
//改
void changeStructElement(LinkList pNode, uint changeLocation, ElementType structData);
//查
void findStructElement(LinkList pNode, uint findLocation);
//二级函数(不会直接调用,一般是被一级函数用)
void checkNodeInsertLocation(uint flag); //检查结构体插入位置是否合理
void checkNodeCreat(LNode *Node);        //检查结构体是否创建成功
void checkError(uint flag);              //问题处理
void checkNodeIsEmpty(LNode *Node);      //检查链表是否为空链表

int main()
{
    LNode *Node1 = (LNode *)(malloc(sizeof(LNode)));
    checkNodeCreat(Node1);
    structInit(Node1);
    structInsertArray(headNode, pa, MaxLength1);
    printfStructData(headNode, structLength);
    deleteStructElement(headNode, 2);
    printfStructData(headNode, structLength);
    findStructElement(headNode, 3);
    printfStructData(headNode, structLength);
    changeStructElement(headNode, 3, 99);
    printfStructData(headNode, structLength);
    while (1);
    return 0;
}

/*
功能:初始化新建的链表
parameter:新建的链表的头结点
*/
void structInit(LNode *pNode)
{
    pNode->data = 0;
    pNode->prior = pNode;
    pNode->next = pNode;
    headNode = pNode;
    finalNode = pNode;
    presentNode = pNode;
}

/*
输出链表的每一个数据
parameter:
pNode:头结点
nowStructLength:当前链表长度
*/
void printfStructData(LinkList pNode, uint nowStructLength)
{
    uint flag = 0;
    while (nowStructLength != 0)
    {
        nowStructLength--;
        pNode = pNode->next;
        printf("%d", pNode->data);
        if (nowStructLength != 0)
        {
            printf("->");
        }
    }
    printf("\n");
}

/*
错误检索
功能:函数返回值检测,检测函数是否运行成功,如果失败,则报出对应的错误
parameter: 其他函数的返回值
*/
void checkError(uint flag)
{
    if (flag == 401)
        printf("\nERROR:401. Insert location is wrong. Can not be 0 or greater than structLength.\n");
    else if (flag == 501)
        printf("\nERROR:501. Creat struct is defated\n.");
    else if (flag == 502)
        printf("\nError:502. List is empty.\n");
}

/*
检查结构体是否创建成功
*/
void checkNodeCreat(LNode *Node)
{
    if (Node == NULL)
    {
        checkError(501);
    }
}

/*
检查链表是否为空
*/
void checkNodeIsEmpty(LNode *Node)
{
    if (Node->next == Node && Node->prior == Node)
    {
        checkError(502);
    }
}
/*
检查插入位置是否越界
parameter:
insertLocation:插入的位置
*/
void checkNodeInsertLocation(uint insertLocation)
{
    if (insertLocation < 1 || insertLocation > structLength + 1) //如果是空结构体,插入第一个,插入位置等于1,structLength+1=1,刚好不大于
        checkError(401);
}

/*
功能:给双向链表的指定位置插入数据
parameter:
pNpde:头结点
insertLocation:插入位置
insertData:插入数据值
eg:
插入位置:2,插入数据:6
插入前:头结点 1 2 3 4
插入后:头结点 1 6 2 3 4
*/
void structInsert(LinkList pNode, ElementType insertLocation, uint insertData)
{
    int i = 0;
    LNode *newNode = (LNode *)(malloc(sizeof(LNode)));
    checkNodeCreat(newNode);
    checkNodeInsertLocation(insertLocation);
    for (i = 0; i < insertLocation; i++)
    {
        pNode = pNode->next;
    }
    newNode->data = insertData;
    pNode->prior->next = newNode;
    newNode->prior = pNode->prior;
    newNode->next = pNode;
    pNode->prior = newNode;

    structLength++;
}

/*
功能:在结构体末尾连续插入一串数组。主要是用来结构体初始化,给刚创建的空链表赋一些值
parameter:
pNpde:要插入的链表的头结点
pData:传入的数组
dataLength:传入的数组的长度
*/
void structInsertArray(LinkList pNode, ElementType *pData, uint dataLength)
{
    uint flag;

    for (flag = 0; flag < dataLength; flag++)
    {
        structInsert(pNode, structLength + 1, *pData++);
    }
}

    /*
功能:给双向链表的指定位置删除数据
parameter:
pNpde:头结点
insertLocation:删除位置
eg:
删除位置:2
插入前:头结点 1 2 3 4
插入后:头结点 1 3 4
*/
    void
    deleteStructElement(LinkList pNode, uint deleteLocation)
{
    int i = 0;
    checkNodeCreat(pNode);
    checkNodeInsertLocation(deleteLocation);
    for (i = 0; i < deleteLocation; i++)
    {
        pNode = pNode->next;
    }
    printf("要删除的结点值为:%d\n", pNode->data);
    pNode->prior->next = pNode->next;
    pNode->next->prior = pNode->prior;
    free(pNode);

    structLength--;
}

/*
查找某一个结点的值
*/
void findStructElement(LinkList pNode, uint findLocation)
{
    int i = 0;
    checkNodeCreat(pNode);
    checkNodeInsertLocation(findLocation);
    for (i = 0; i < findLocation; i++)
    {
        pNode = pNode->next;
    }
    printf("要查找的元素值为%d\n", pNode->data);
}

//修改某一个结点的值
void changeStructElement(LinkList pNode, uint changeLocation, ElementType structData)
{
    int i = 0;
    checkNodeCreat(pNode);
    checkNodeInsertLocation(changeLocation);
    for (i = 0; i < changeLocation; i++)
    {
        pNode = pNode->next;
    }
    pNode->data = structData;
    printf("删除的元素为%d\n", pNode->data);
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:21:50  更:2021-09-27 14:23:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 14:37:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码