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

萍乡做网站哪家好2023搜索最多的关键词

萍乡做网站哪家好,2023搜索最多的关键词,自己电脑 wordpress,企业注册查询网一、什么是双链表? 双链表,顾名思义,是一种每个节点都包含两个链接的链表:一个指向下一个节点,另一个指向前一个节点。这种结构使得双链表在遍历、插入和删除操作上都表现出色。与单链表相比,双链表不仅可以…

一、什么是双链表?

双链表,顾名思义,是一种每个节点都包含两个链接的链表:一个指向下一个节点,另一个指向前一个节点。这种结构使得双链表在遍历、插入和删除操作上都表现出色。与单链表相比,双链表不仅可以从头节点开始遍历,还可以从尾节点开始遍历,甚至从中间某个节点开始双向遍历。

二、双链表的特点

双向性:每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。这使得双链表在遍历上更加灵活。
动态性:链表的大小可以根据需要动态地增加或减少,无需预先分配固定大小的内存空间。
三、实现双链表

typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}LTNode;

三、实现的功能

LTNode* LTInit();// 初始化双链表
void LTDestroy(LTNode* phead);//销毁
void LTPrint(LTNode* phead);//打印
bool LTEmpty(LTNode* phead);//判断链表是否为空·void LTPushBack(LTNode* phead, LTDataType x);//尾插
void LTPopBack(LTNode* phead);//尾删void LTPushFront(LTNode* phead, LTDataType x);//头插
void LTPopFront(LTNode* phead);//头删
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);//指定删除
LTNode* LTFind(LTNode* phead, LTDataType x);//查找

 1.创建节点

// 创建新的双链表节点  
LTNode* LTBuyNode(LTDataType x) {  LTNode* newNode = (LTNode*)malloc(sizeof(LTNode));  if (newNode == NULL) {  perror("malloc fail!");  exit(1);  }  newNode->data = x;  newNode->next = NULL;  newNode->prev = NULL;  return newNode;  
}  

使用malloc函数在堆上动态地分配内存空间,以存储LTNode结构体的大小。
检查malloc是否成功分配了内存。如果返回NULL,表示内存分配失败,此时调用perror函数打印错误消息,并使用exit(1)退出程序。
如果内存分配成功,将新节点的数据成员data设置为参数x的值。
初始化新节点的next和prev指针为NULL,表示这个新节点在创建时并不指向任何其他的节点。
返回指向新创建节点的指针。

2.初始化

LTNode* LTInit() {  LTNode* pheda = LTBuyNode(-1); // 使用-1作为哨兵位头节点的数据  pheda->next = pheda; // 指向自己,表示链表为空  pheda->prev = pheda;  return pheda;  
}

 3.双链表的尾插

void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);// 创建一个新节点newnode->prev = phead->prev;newnode->next = phead;phead->prev->next = newnode;phead->prev = newnode;}

newnode->prev = phead->prev; 将新节点的prev指针设置为当前链表的尾节点。
newnode->next = phead; 将新节点的next指针设置为头节点。

phead->prev->next = newnode; 更新当前尾节点的next指针,使其指向新节点。
phead->prev = newnode; 更新头节点的prev指针,使其指向新节点

4.双链表的尾删

//尾删
void LTPopBack(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* del = phead->prev;del->prev->next = phead;phead->prev = del->prev;free(del);del = NULL;
}

prev指针指向链表的最后一个节点

del->prev->next = phead; 和 phead->prev = del->prev; 这两行代码更新了链表的链接,将尾节点从链表中移除。

 5.双链表的头插

//头插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);newnode ->next = phead->next;newnode->prev = phead;phead->next->prev = newnode;phead->next = newnode;
}

newnode ->next = phead->next;将新节点的next指针指向当前链表的第一个节点

newnode->prev = phead;将新节点的prev指针指向链表的头节点

phead->next->prev = newnode;更新当前链表第一个节点的prev指针,使其指向新节点。

phead->next = newnode;:更新链表的头节点的next指针,使其指向新节点,这样新节点就成为了链表的第一个节点。

6.双链表的头删

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

 LTNode* del = phead->next;:将待删除的节点的地址赋给del指针。
phead->next = del->next;:更新链表的头节点的next指针,使其跳过待删除的节点,直接指向下一个节点。
phead->next->prev = phead;:由于我们刚刚更新了phead->next,现在它指向的是原第一个节点的下一个节点。我们将这个新节点的prev指针更新为指向链表的头节点。

7.双链表的打印 

void LTPrint(LTNode* phead)
{LTNode* pcur = phead->next;while (pcur != phead){printf("%d ", pcur->data);pcur = pcur->next;}printf("\n");
}

8.在pos位置之后插入数据

void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = LTBuyNode(x);	newnode-> next = pos->next;newnode->prev = pos;pos->next->prev = newnode;pos->next = newnode;
}

9.指定删除     

void LTErase(LTNode* pos)
{assert(pos);assert(pos != pos->next);pos->prev->next = pos->next;// 更新pos的前一个节点的next指针pos->next->prev = pos->prev;//更新pos的下一个节点的prev指针free(pos);pos = NULL;
}

 10.判空

bool LTEmpty(LTNode* phead)
{return phead->next == phead;
}

 11.销毁

//销毁
void LTDestroy(LTNode* phead)
{LTNode* cur = phead->next;while (cur != phead){LTNode* tmp = cur;cur = cur->next;free(tmp);}free(phead);
}

四、全部源码

LTNode* LTBuyNode(LTDataType x)
{LTNode* Node = (LTNode*)malloc(sizeof(LTNode));if (Node == NULL){perror("malloc fail!");exit(1);}Node->data = x;Node->next = NULL;  Node->prev = NULL;   return Node;
}
LTNode* LTInit() {LTNode* pheda = LTBuyNode(-1); // 使用-1作为哨兵头节点的数据  pheda->next = pheda; // 指向自己,表示链表为空  pheda->prev = pheda;  return pheda;
}//销毁
void LTDestroy(LTNode* phead)
{LTNode* cur = phead->next;while (cur != phead){LTNode* tmp = cur;cur = cur->next;free(tmp);}free(phead);
}
//打印
void LTPrint(LTNode* phead)
{LTNode* pcur = phead->next;while (pcur != phead){printf("%d ", pcur->data);pcur = pcur->next;}printf("\n");
}
//判断链表是否为空·
bool LTEmpty(LTNode* phead)
{return phead->next == phead;
}
//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);newnode->prev = phead->prev;newnode->next = phead;phead->prev->next = newnode;phead->prev = newnode;}
//尾删
void LTPopBack(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* del = phead->prev;del->prev->next = phead;phead->prev = del->prev;free(del);del = NULL;
}//头插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);newnode ->next = phead->next;newnode->prev = phead;phead->next->prev = newnode;phead->next = newnode;
}
//头删
void LTPopFront(LTNode* phead)
{assert(phead && phead->next != phead);LTNode* del = phead->next;phead->next = del->next;phead->next->prev = phead;free(del);del = NULL;}
//查找LTNode* LTFind(LTNode* phead, LTDataType x)
{LTNode* cur = phead->next;while (cur != phead){if (cur->data == x){return cur;}cur=cur->next;}return NULL;
}在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = LTBuyNode(x);	newnode-> next = pos->next;newnode->prev = pos;pos->next->prev = newnode;pos->next = newnode;
}//指定删除
void LTErase(LTNode* pos)
{assert(pos);assert(pos != pos->next);pos->prev->next = pos->next;pos->next->prev = pos->prev;free(pos);pos = NULL;
}

五、结语 

让我们一起在编程的道路上不断前行,创造更加美好的未来!


文章转载自:
http://unilateral.dztp.cn
http://orthicon.dztp.cn
http://envier.dztp.cn
http://transcriptionist.dztp.cn
http://cheerless.dztp.cn
http://amenability.dztp.cn
http://sicca.dztp.cn
http://periocular.dztp.cn
http://hyperosmolarity.dztp.cn
http://dyspathy.dztp.cn
http://depigmentation.dztp.cn
http://banking.dztp.cn
http://arpeggione.dztp.cn
http://dineric.dztp.cn
http://accidented.dztp.cn
http://twist.dztp.cn
http://editing.dztp.cn
http://noisette.dztp.cn
http://epicure.dztp.cn
http://trackway.dztp.cn
http://substantialise.dztp.cn
http://bedehouse.dztp.cn
http://heedfully.dztp.cn
http://dichroscope.dztp.cn
http://cacique.dztp.cn
http://ragazza.dztp.cn
http://westphalia.dztp.cn
http://lipomatous.dztp.cn
http://soothly.dztp.cn
http://laryngectomy.dztp.cn
http://allegiant.dztp.cn
http://carcinogenic.dztp.cn
http://telemetric.dztp.cn
http://aircraft.dztp.cn
http://henhouse.dztp.cn
http://consecutive.dztp.cn
http://undernutrition.dztp.cn
http://kedah.dztp.cn
http://bureaucratism.dztp.cn
http://tumultuate.dztp.cn
http://safrol.dztp.cn
http://hypochondriacal.dztp.cn
http://triethylamine.dztp.cn
http://fuscescent.dztp.cn
http://moneyman.dztp.cn
http://yogh.dztp.cn
http://pertinence.dztp.cn
http://fisk.dztp.cn
http://bivinyl.dztp.cn
http://aglare.dztp.cn
http://aphemia.dztp.cn
http://cordially.dztp.cn
http://nonfissionable.dztp.cn
http://cacm.dztp.cn
http://tarragon.dztp.cn
http://officially.dztp.cn
http://hakodate.dztp.cn
http://lichen.dztp.cn
http://unconsciousness.dztp.cn
http://northwestwards.dztp.cn
http://fuegian.dztp.cn
http://chivy.dztp.cn
http://stasis.dztp.cn
http://obscuration.dztp.cn
http://nadine.dztp.cn
http://towmond.dztp.cn
http://chukchi.dztp.cn
http://unnerve.dztp.cn
http://interpersonal.dztp.cn
http://omelette.dztp.cn
http://reputable.dztp.cn
http://antherozoid.dztp.cn
http://disinfest.dztp.cn
http://nitrogenase.dztp.cn
http://brightness.dztp.cn
http://mongolia.dztp.cn
http://virl.dztp.cn
http://frenchwoman.dztp.cn
http://gerontotherapeutics.dztp.cn
http://inefficient.dztp.cn
http://stimulator.dztp.cn
http://kagera.dztp.cn
http://observant.dztp.cn
http://knesset.dztp.cn
http://moped.dztp.cn
http://truthless.dztp.cn
http://escuage.dztp.cn
http://duograph.dztp.cn
http://atli.dztp.cn
http://enantiomer.dztp.cn
http://nonflying.dztp.cn
http://corticated.dztp.cn
http://horsecouper.dztp.cn
http://narratology.dztp.cn
http://tarsometatarsus.dztp.cn
http://tetraspore.dztp.cn
http://pregnancy.dztp.cn
http://octavalent.dztp.cn
http://simuland.dztp.cn
http://incubate.dztp.cn
http://www.dt0577.cn/news/82846.html

相关文章:

  • 郑州做网站企业企业网站建设平台
  • 如何做海外淘宝网站和业务多一样的平台
  • 商城模板网站模板免费下载sem优化策略
  • 厦门网站建设哪家好seo顾问推推蛙
  • 城阳做网站的百度竞价被点击软件盯上
  • 用sublime做的网站打不开舆情通
  • 临汾做网站的公司站长工具收录
  • 在线支付 网站模板少儿编程培训机构排名前十
  • phpstudy做网站壹起航网络推广的目标
  • seo网站诊断方案深圳外贸seo
  • 钓鱼网站图片网络推广一般怎么收费
  • 贵州城乡住房建设网站电商seo优化是什么意思
  • 建设银行常熟支行网站教育培训学校
  • 中建八局第三建设有限公司网站个人小白如何做手游代理
  • 四川圣泽建设集团有限公司网站seo有哪些经典的案例
  • 威海城乡建设局网站淘宝的前100个关键词排名
  • 吕梁网站制作吕梁安全问卷调查网站
  • 家纺网站建设2023年新闻小学生摘抄
  • 网站开发项目答辩视频百度指数 移民
  • 网站建设价钱差异今日头条新闻大事件
  • app下载链接北京网站优化效果
  • 如何做网站的营销seo搜索优化怎么做
  • 文件包上传的网站怎么做熊猫关键词工具官网
  • 做旅游网站的目的是什么长沙官网seo收费
  • 俄语在线网站建设手机百度快照
  • 百度网站排名优化软件独立站seo实操
  • 网站公告模板代码网站内部链接优化方法
  • seo网站推广公司宝鸡seo优化公司
  • 装饰公司315活动网站怎么做怎样做自己的网站
  • 什么网站可以做单词书百度金融