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

双向链表基本知识

一、基本知识

1、两个指针,可以通过任意一个结点找到其前一个结点和后一个结点

二、基本操作

2.1、创建一个双向链表

Dlink_t *Create_doublelink()
{Dlink_t *pdoulink = malloc(sizeof(Dlink_t));if(pdoulink == NULL){return NULL;}pdoulink->phead = NULL;pdoulink->clen = 0;pthread_mutex_init(&(pdoulink->mutex),NULL);return pdoulink;
}

 2.2、头插

nt push_doublelink(Dlink_t *dblink,Stu_t data)
{Dlink_node_t *dbnode = malloc(sizeof(Dlink_node_t));if(dbnode == NULL){perror("fail dbnode");return -1;}dbnode->data = data;dbnode->pperv = NULL;dbnode->pnext = NULL;if(is_empty_doublelink(dblink)){dblink->phead = dbnode;}else{dbnode->pnext = dblink->phead;dblink->phead->pperv = dbnode;dblink->phead = dbnode;}dblink->clen++;return 0;
}

2.3、尾插

int push_tail_doublelink(Dlink_t *dblink,Stu_t data)
{Dlink_node_t *dbnode = malloc(sizeof(Dlink_node_t));if(dbnode == NULL){perror("fail dbnode");return -1;}dbnode->data = data;dbnode->pperv = NULL;dbnode->pnext = NULL;Dlink_node_t *dnode = dblink->phead;if(is_empty_doublelink(dblink)){dblink->phead = dbnode;}else{while(dnode->pnext != NULL){dnode = dnode->pnext;}dnode->pnext = dbnode;dbnode->pperv = dnode;}
}

2.4、头删

int delete_head_doublelink(Dlink_t *dblink)
{if(is_empty_doublelink(dblink)){return -1;}Dlink_node_t *dbnode = dblink->phead;dblink->phead = dbnode->pnext;if(dbnode->pnext != NULL){dbnode->pnext->pperv = NULL;}free(dbnode);dblink->clen--;return 0;
}

2.5、尾删

int delete_tail_doublelink(Dlink_t *dblink)
{if(is_empty_doublelink(dblink)){return -1;}Dlink_node_t *dnode = dblink->phead;while(dnode->pnext != NULL){dnode = dnode->pnext;}if(donde->pperv != NULL){dnode->pperv->pnext = NULL;}free(dnode);dblink->clen--;  return 0;
}

2.6、查询

Dlink_node_t *select_doublelink(Dlink_t *dblink,Stu_t data)
{if(is_empty_doublelink(dblink)){return NULL;}Dlink_node_t *dnode = dblink->phead;while(!strcmp(dnode->data.name,data.name)){dnode =dnode->pnext;}return dnode;
}

2.7、修改

}
Dlink_node_t *alter_doublelink(Dlink_t *dblink,Stu_t data,char *p)
{Dlink_node_t *q = select_doublelink(dblink,data);strcpy(q->data.name,p);return q;
}

2.8、销毁

int destory_doublelink(Dlink_t *dblink)
{if(is_empty_doublelink(dblink)){return -1;}Dlink_node_t *pnode = NULL;Dlink_node_t *p = NULL;while(dblink->phead != NULL){pnode = dblink->phead;dblink->phead = pnode->pnext;cc}free(dblink);return 0;
}

注意

在销毁的时候,要需注意在此用的是头删,我们需要考虑,头删的结点,的下一个结点是否存在,也就是说特列是只有一个结点,如果不考虑会造成指针越界 

2.9、遍历

void doulink_for_each(DLink_t *pdoulink, int dir)
{if (is_empty_doulink(pdoulink))return;DLink_Node_t *p = pdoulink->phead;if (dir){while (p != NULL){printf("%d %s %d\n", p->data.id, p->data.name, p->data.score);p = p->pnext;}}else{while (p->pnext != NULL){p = p->pnext;}while (p != NULL){printf("%d %s %d\n", p->data.id, p->data.name, p->data.score);p = p->ppre;}}printf("\n");}


http://www.mrgr.cn/news/19752.html

相关文章:

  • C++11第一弹:简介 | 统一的列表初始化 | 声明
  • 2024/9/4 Canlink配置介绍与常见故障排查
  • pytest 常用的辅助函数和工具函数
  • js中的new Data操作归纳(会持续补充)
  • 第九届“创客中国”生成式人工智能中小企业创新创业大赛招商推介圆满落幕
  • 告别冗长 if...else 的多种方法
  • 如何在移动端app里嵌套web页面之react-native-webview
  • 1.第二阶段x86游戏实战2-前言
  • 前端常用的几种设计模式--观察者模式、单例模式等
  • 【openwrt-21.02】T750 openwrt MT7916 WPS PBC功能实现
  • FFmpeg源码:get_audio_frame_duration、av_get_audio_frame_duration2函数分析
  • 云计算之网络
  • 【JS笔试题】模拟一个微任务
  • Spring 状态机
  • Serverless 应用引擎 SAE 助力袋拉拉研发提效 70%
  • 深度学习|模型推理:端到端任务处理
  • 前端入门了解
  • Pencils Protocol生态新进展,即将上线 Vault 产品
  • 23合并 K 个升序链表
  • 【python】Python如何通过线程池来提高程序的执行效率