现在正处于国家面临困难时期,虽然咋不能向广大医务人员那样赴身武汉,但可以和大家一块分享点学习经验。宅在家的小伙伴无聊的看看,学一学,毕竟听从国家安排,不出门,不闲逛,咋们一起来学习数据结构,提升提升自己,打发打发无聊的时间。小明同学其实也是一个超级小白,知识在不断的笔记,思考中提升自己,有兴趣的同学可以关注我,每天更新,一起学习,没事还会发布一些做的有趣小程序,或者刚学的有趣插件分享给大家
双向链表简介。
为了克服单链表单向性的缺点,可利用双向链表。
双向链表有两个指针域,一个指向直接后继,另一个指向直接前驱。
双向链表的存储结构
typedef int ElemType;
typedef struct DuLNode {
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
} DuLNode, *DuLinkList;
双向链表跟单链循环表类似。如图所示
双向链表存储结构示意图(加载百度)
- 在双向链表中,有些操作,仅需涉及一个方向的指针,则它们的算法描述和线性链表的操作相同,但在插入、删除时候有很打不同,在双向链表中需要同时修改两个指针。
双向链表的插入
void Do_ListInset(DuLinkList &L, int i, ElemType e) {
DuLinkList p, s;
if (!(p = Do_ListGetElem(L, i))) {
printf("插入位置错误\n");
} else{
s = new DuLNode;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
printf("插入成功\n");
}
}
- 对于的我的理解,,就好像一群人手拉着手,环环相扣,从第一个人到第十个人,如果前驱之左手的话,后继指右手,你想想如果要在你右边插入一个人呢,是不是就是放开右手,拉住加的这个人的左手,然后这个人用右手拉住刚刚拉的那个人的左手呢。所以,删除结点也是一样的。
双向链表的删除
void Do_ListDelete(DuLinkList &L, int i) {
DuLinkList p;
if (!(p = Do_ListGetElem(L, i))) {
printf("位置错误\n");
return;
}
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
printf("删除成功\n");
}
有双向链表,当然就有双向循环链表,有兴趣的还可以自行研究,很多有趣的数据结构图,以及各种神奇的算法都在数据结构中。
网友评论