一郎科技|就靠这20+张图了,一口气搞懂「链表」( 四 )
}
在单链表的基础上 , 对于每一个结点设计一个前驱结点 , 前驱结点与前一个结点相互连接 , 构成一个链表 , 就产生了双向链表的概念了 。
双向链表可以简称为双链表 , 是链表的一种 , 它的每个数据结点中都有两个指针 , 分别指向直接后继和直接前驱 。 所以 , 从双向链表中的任意一个结点开始 , 都可以很方便地访问它的前驱结点和后继结点 。
双向链表的结点设计对于每一个结点而言 , 有:
next代表的是后继指针 , 它总是指向当前结点的下一个结点 , 如果当前结点是尾结点 , 则next指针为空
其代码设计如下:
typedefstructline{
intdata;//data
structline*pre;//prenode
structline*next;//nextnode
}line,*a;
//分别表示该结点的前驱(pre) , 后继(next) , 以及当前数据(data)
双链表的创建
创建双向链表需要先创建头结点 , 然后逐步的进行添加双向链表的头结点是有数据元素的 , 也就是头结点的data域中是存有数据的 , 这与一般的单链表是不同的 。
对于逐步添加数据 , 先开辟一段新的内存空间作为新的结点 , 为这个结点进行的data进行赋值 , 然后将已成链表的上一个结点的next指针指向自身 , 自身的pre指针指向上一个结点 。
其代码可以设计为:
//创建双链表
line*initLine(line*head){
intnumber,pos=1,input_data;
//三个变量分别代表结点数量 , 当前位置 , 输入的数据
printf("请输入创建结点的大小n");
scanf("%d",&number);
if(number<1){return;}//输入非法直接结束
//////头结点创建///////
head=(line*)malloc(sizeof(line));
head->pre=;
head->next=;
printf("输入第%d个数据n",pos++);
scanf("%d",&input_data);
head->data=https://pcff.toutiao.jxnews.com.cn/p/20200829/input_data;
line*list=head;
while(pos<=number){
line*body=(line*)malloc(sizeof(line));
body->pre=;
body->next=;
printf("输入第%d个数据n",pos++);
scanf("%d",&input_data);
body->data=https://pcff.toutiao.jxnews.com.cn/p/20200829/input_data;
list->next=body;
body->pre=list;
list=list->next;
}
returnhead;
}
双向链表创建的过程可以分为:创建头结点->创建一个新的结点->将头结点和新结点相互链接->再度创建新结点 , 这样会有助于理解 。
双向链表的插入操作如图所示:
推荐阅读
- 无趣科技谈|X2凭实力拿下冠军,京东手机周销量榜单出炉,Find
- 毛毛科技说|三星S20+出现“小米价”,总算等到了,三星扛不住了
- 简简科技|余承东称鸿蒙体验已达安卓7成多,鸿蒙手机新进展
- ITheat热点科技|2020 | 坚持创新 舒尔带来MXA710音频解决方案,SSOT
- 空心|招聘丨山西千沐云物联科技有限公司
- LeoGo科技|科沃斯除菌地宝N8和米家扫拖机器人横评——两款解放双手的精品
- 小绿叶子科技|半年跌1000元,适合捡漏,iPhoneSE2扛不住了
- 电科技|“吃鸡”手游老是瞄不准?不妨选这款游戏外设配件
- 科技日日说|realme真我X7全方位评测:不一样的颜值,不一样的体验!,原创
- 硅谷聊科技|就不愿再用华为、小米了?,答案确认了!为啥很多人用了iPhone后