当前位置: 首页 > news >正文

网站后期维护方案漯河网站建设漯河

网站后期维护方案,漯河网站建设漯河,网站建设投放广告,企业网站建设制作目录1 双链表的概念2 双链表的结构3 双链表的操作3.1 双链表的初始化3.2 双链表的尾插3.3 双链表的头插3.4 双链表的尾删3.5 双链表的头删3.6 双链表的查找3.7 在指定位置后插入新结点3.8 删除指定结点3.9 释放双链表4 双链表整体实现1 双链表的概念 双链表一般指的是双向循环…

目录

  • 1 双链表的概念
  • 2 双链表的结构
  • 3 双链表的操作
    • 3.1 双链表的初始化
    • 3.2 双链表的尾插
    • 3.3 双链表的头插
    • 3.4 双链表的尾删
    • 3.5 双链表的头删
    • 3.6 双链表的查找
    • 3.7 在指定位置后插入新结点
    • 3.8 删除指定结点
    • 3.9 释放双链表
  • 4 双链表整体实现

1 双链表的概念

双链表一般指的是双向循环带头结点的链表
循环
链表首尾连接,可以通过尾结点找到头结点,也可以通过头结点找到尾结点
头结点
在链表的头部设置一个结点,它不存储任何有效数据,用来简化操作
双向
链表的每个结点设置一前一后两个指针,分别指向前一个结点和后一个结点

图示
在这里插入图片描述

2 双链表的结构

双链表的每个结点都包含了数据域和一前一后的指针域,因此结构如下:

//双向链表
typedef int LTDataType;
typedef struct ListNode
{struct ListNode* prev; //指向前一个结点的指针LTDataType data; //数据struct ListNode* next; //指向下一个结点的指针
}LTNode;

3 双链表的操作

3.1 双链表的初始化

由于双链表有头结点,因此在创建双链表时,要先为其创建一个头结点,并使它的前后指针指向自己
在这里插入图片描述
代码实现

//创建新结点
LTNode* LTCreateNode(LTDataType x)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));assert(node);node->data = x;node->prev = node;node->next = node;return node;
}//双向链表初始化
LTNode* LTInit()
{LTNode* head = LTCreateNode(-1);return head;
}

3.2 双链表的尾插

head 指向了头结点,node 为新创建的结点,prev 为指向前一个结点的指针,next 为指向后一个结点的指针
在这里插入图片描述

void LTPushBack(LTNode* head, LTDataType x)
{assert(head);LTNode* node = LTCreateNode(x);node->prev = head->prev;node->next = head;head->prev = node;node->prev->next = node;
}

3.3 双链表的头插

head 指向了头结点,node 为新创建的结点,prev 为指向前一个结点的指针,next 为指向后一个结点的指针
在这里插入图片描述
代码实现

void LTPushFront(LTNode* head, LTDataType x)
{assert(head);LTNode* node = LTCreateNode(x);node->prev = head;node->next = head->next;head->next = node;node->next->prev = node;}

3.4 双链表的尾删

del 为要删除的结点,prev 指向了前一个结点,next 指向了后一个结点
在这里插入图片描述
代码实现

void LTPopBack(LTNode* head)
{assert(head && head->prev != head);LTNode* del = head->prev; //记录尾节点del->prev->next = head;head->prev = del->prev;free(del);del = NULL;}

3.5 双链表的头删

del 为要删除的结点,prev 指向了前一个结点,next 指向了后一个结点
在这里插入图片描述
代码实现

//头删
void LTPopFront(LTNode* head)
{assert(head && head->next != head);LTNode* del = head->next;del->next->prev = del->prev;del->prev->next = del->next;free(del);del = NULL;
}

3.6 双链表的查找

x 为要查找的值,通过 cur 指针来遍历链表,查找到结点时,返回结点,未查找到则返回空指针
在这里插入图片描述
代码实现

LTNode* LTFind(LTNode* head, LTDataType x)
{assert(head);LTNode* cur = head->next;while (cur != head){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}

3.7 在指定位置后插入新结点

pos 为指定的位置,node 为新结点,prev 指针指向前一个结点,next 指针指向后一个结点
在这里插入图片描述
代码实现

void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* node = LTCreateNode(x);//pos node pos->nextnode->next = pos->next;node->prev = pos;pos->next->prev = node;pos->next = node;
}

3.8 删除指定结点

pos 为指定的结点,prev 指针指向前一个结点,next 指针指向后一个结点
在这里插入图片描述
代码实现

void LTErase(LTNode* pos)
{assert(pos);pos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;}

3.9 释放双链表

cur 指向要释放的结点,tail 则用来记录下一个要释放的结点
在这里插入图片描述
代码实现

void LTDestroy(LTNode* head)
{assert(head);LTNode* cur = head->next;while (cur != head){LTNode* tail = cur->next;free(cur);cur = tail;}free(cur);cur = NULL;
}

4 双链表整体实现

List.c

#include "List.h"
//函数的实现//创建新结点
LTNode* LTCreateNode(LTDataType x)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));assert(node);node->data = x;node->prev = node;node->next = node;return node;
}//双向链表初始化
LTNode* LTInit()
{LTNode* head = LTCreateNode(-1);return head;
}//打印
void LTPrint(LTNode* head)
{assert(head);LTNode* cur = head->next;while (cur != head){printf("%d->", cur->data);cur = cur->next;}printf("\n");
}//尾插
void LTPushBack(LTNode* head, LTDataType x)
{assert(head);LTNode* node = LTCreateNode(x);//第一种写法//node->prev = head->prev;//node->next = head;//head->prev->next = node;//head->prev = node;//第二种写法node->prev = head->prev;node->next = head;head->prev = node;node->prev->next = node;
}//头插
void LTPushFront(LTNode* head, LTDataType x)
{assert(head);LTNode* node = LTCreateNode(x);//第一种写法//node->prev = head;//node->next = head->next;//head->next->prev = node;//head->next = node;//第二种写法node->prev = head;node->next = head->next;head->next = node;node->next->prev = node;}//尾删
void LTPopBack(LTNode* head)
{assert(head && head->prev != head);LTNode* del = head->prev; //记录尾节点del->prev->next = head;head->prev = del->prev;free(del);del = NULL;}//头删
void LTPopFront(LTNode* head)
{assert(head && head->next != head);LTNode* del = head->next;del->next->prev = del->prev;del->prev->next = del->next;free(del);del = NULL;
}//查找
LTNode* LTFind(LTNode* head, LTDataType x)
{assert(head);LTNode* cur = head->next;while (cur != head){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}//pos后插入数据
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* node = LTCreateNode(x);//pos node pos->nextnode->next = pos->next;node->prev = pos;pos->next->prev = node;pos->next = node;
}//删除pos结点
void LTErase(LTNode* pos)
{assert(pos);pos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;}//释放链表
void LTDestroy(LTNode* head)
{assert(head);LTNode* cur = head->next;while (cur != head){LTNode* tail = cur->next;free(cur);cur = tail;}free(cur);cur = NULL;
}//判断链表是否为空
bool LTEmpty(LTNode* head)
{assert(head);if (head->next == head)return true;return false;
}

List.h

//结构体,函数的声明
#pragma once
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <stdbool.h>//双向链表
typedef int LTDataType;
typedef struct ListNode
{LTDataType data; //数据struct ListNode* prev; //指向前一个结点的指针struct ListNode* next; //指向下一个结点的指针
}LTNode;//初始化
LTNode* LTInit();//打印
void LTPrint(LTNode* head);//尾插
void LTPushBack(LTNode* head, LTDataType x);//头插
void LTPushFront(LTNode* head, LTDataType x);//尾删
void LTPopBack(LTNode* head);//头删
void LTPopFront(LTNode* head);//查找
LTNode* LTFind(LTNode* head, LTDataType x);//pos后插入数据
void LTInsert(LTNode* pos, LTDataType x);//删除pos结点
void LTErase(LTNode* pos);//释放链表
void LTDestroy(LTNode* head);//判断是否为空链表
bool LTEmpty(LTNode* head);
http://www.dtcms.com/a/460498.html

相关文章:

  • 网页和网站的不同苏州公司名称查询
  • a站是指哪个网站学校门户网站建设说明
  • 广州网站建设商家理卖做各视频网站的会员
  • 汕头建设企业网站广元做开锁网站
  • 工业和信息化部网站备案系统是什么意思程序员免费自学网站
  • 游戏类网站备案多语言网站怎么做
  • 深圳龙岗网站建设公司哪家好中国做网站最好的企业
  • 校园二手网站开发赣州网上商城系统
  • wordpress音乐站源码网站建设基础摘要
  • 服装如何做微商城网站怎样建网站买东西
  • 网站备案类型及条件申请商标注册
  • 1年网站视频网站能备案吗
  • 免费建站平台哪个好怎么在建设部网站查注册造价师
  • 怎么做简易网站简易手工小制作
  • 微信网站制作软件浙江义乌网
  • 帝国网站程序三亚政策最新消息
  • 山东青岛网站建设公司排名外贸做网站
  • 番禺人才网官方网站信息公布如何做好一个百度竞价网站
  • 网站做图分辨率是多少合适雅奇小蘑菇做网站好不好用
  • 英德市建设局网站腾讯网站建设公司
  • 如何建CMS网站网站盈利模式分析怎么做
  • 联盟设计库seo是如何优化
  • 生态文明建设网站南昌网站建设和推广
  • 北京天仪建设工程质量检测所网站购物app排行榜
  • 手机版企页网站案例句容网站
  • 网站建设公司 销量线上推广引流平台
  • 深圳网站搭建哪里找海南房地产网站
  • 做汽配的都上什么网站网站怎么搬家到快云vps里面去啊
  • 做公司网站备案可以个人直通车关键词怎么选 选几个
  • photoshop网站设计360免费wifi安卓版下载