c的链表实现
c的链表实现
复习了 单向链表、双向链表 ,代码中注释不多,但基本从函数名字就可以知道函数的作用。
双向链表中的前后节点中的思路是按照linux内核中思路写的。
环境
GCC 7.4.0
单向链表
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int pos;
int data;
struct node *next;
}*lnode,*llist,node;
void insert(llist list, int data, int pos){
if(!list){
list->pos = pos;
list->data = data;
list->next = NULL;
}else{
lnode tmp = (lnode)malloc(sizeof(node));
tmp->pos = pos;
tmp->data = data;
tmp->next = NULL;
lnode tmps = list;
while(tmps->next != NULL){
tmps = tmps->next;
}
tmps->next = tmp;
}
}
void delete(llist list, int pos){
if(list->pos == pos){
llist tmp = list;
list = list->next;
free(tmp);
}else{
lnode tmp = list;
lnode tmps = tmp->next;
while(tmp->next != NULL){
if(tmps->pos == pos){
tmp->next = tmps->next;
free(tmps);
break;
}else{
tmp = tmps;
tmps = tmps->next;
}
}
}
}
void changedata(llist list, int data, int pos){
if(list->pos == pos){
list->data = data;
}else{
lnode tmp = list->next;
while(tmp->pos != pos && tmp->next != NULL){
tmp = tmp->next;
}
if(tmp->next != NULL){
tmp->data = data;
}else if(tmp->pos == pos){
tmp->data = data;
}else{
printf("Can't find the element!\n");
}
}
}
void deletelist(llist list){
lnode p = list;
while(list->next){
p = list;
list = p->next;
free(p);
}
free(list);
}
void show(llist list){
lnode tmp = list;
while(tmp->next != NULL){
printf("pos:%d,data:%d\n",tmp->pos,tmp->data);
tmp = tmp->next;
}
printf("pos:%d,data:%d\n",tmp->pos,tmp->data);
}
int main(){
llist list = (llist)malloc(sizeof(node));
list->pos = 0;
list->data = 7;
list->next = NULL;
printf("Origin List!\n");
show(list);
insert(list,6,1);
printf("After insert\n");
show(list);
changedata(list,4,1);
printf("After change value\n");
show(list);
insert(list,5,2);
printf("After insert\n");
show(list);
delete(list,1);
printf("After delete\n");
show(list);
deletelist(list);
return 0;
}
双向链表
#include <stdio.h>
#include <stdlib.h>
typedef struct pn{
struct node *prev;
struct node *next;
}pn;
typedef struct node{
int pos;
int data;
struct pn *pn;
}*lnode,*llist,node;
void insert(llist list, int data, int pos){
if(!list){
list->pos = pos;
list->data = data;
list->pn = NULL;
}else{
lnode tmp = (lnode)malloc(sizeof(node));
pn *pntmp = (pn*)malloc(sizeof(pn));
lnode tmps = list;
while(tmps->pn->next != NULL){
tmps = tmps->pn->next;
}
pntmp->prev = tmps;
pntmp->next = NULL;
tmps->pn->next = tmp;
tmp->pos = pos;
tmp->data = data;
tmp->pn = pntmp;
}
}
void delete(llist list, int pos){
if(list->pos == pos){
llist tmp = list;
list = list->pn->next;
list->pn->prev = NULL;
free(tmp);
}else{
lnode tmp = list;
lnode tmps = tmp->pn->next;
while(tmp->pn->next != NULL){
if(tmps->pos == pos){
tmp->pn->next = tmps->pn->next;
tmps->pn->next->pn->prev = tmp;
free(tmps);
break;
}else{
tmp = tmps;
tmps = tmps->pn->next;
}
}
}
}
void changedata(llist list, int data, int pos){
if(list->pos == pos){
list->data = data;
}else{
lnode tmp = list->pn->next;
while(tmp->pos != pos && tmp->pn->next != NULL){
tmp = tmp->pn->next;
}
if(tmp->pn->next != NULL){
tmp->data = data;
}else if(tmp->pos == pos){
tmp->data = data;
}else{
printf("Can't find the element!\n");
}
}
}
void deletelist(llist list){
lnode p = list;
while(list->pn->next){
p = list;
list = p->pn->next;
free(p);
}
free(list);
}
void show(llist list){
lnode tmp = list;
while(tmp->pn->next){
printf("pos:%d,data:%d\n",tmp->pos,tmp->data);
tmp = tmp->pn->next;
}
printf("pos:%d,data:%d\n",tmp->pos,tmp->data);
}
int main(){
llist list = (llist)malloc(sizeof(node));
pn *pnx = (pn*)malloc(sizeof(pn));
pnx->prev = NULL;
pnx->next = NULL;
list->pos = 0;
list->data = 7;
list->pn = pnx;
insert(list,6,1);
show(list);
insert(list,6,2);
changedata(list,5,2);
show(list);
delete(list,1);
show(list);
deletelist(list);
return 0;
}
c的链表实现的更多相关文章
- Redis链表实现
链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结
防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- C语言之链表list
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 用JavaScript来实现链表LinkedList
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...
- 数据结构:队列 链表,顺序表和循环顺序表实现(python版)
链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...
随机推荐
- PP篇11 增、改生产订单组件BAPI
增.改生产订单组件BAPI BAPI_ALM_ORDER_MAINTAIN USE BAPI_ALM_ORDER_MAINTAIN TO CREATE OR CHANGE PM WORK ORDER ...
- EasyNVR网页Chrome无插件播放摄像机视频功能二次开发之云台控制接口示例代码
随着多媒体技术和网络通信技术的迅速发展,视频监控技术在电力系统.电信行业.工业监控.工地.城市交通.水利系统.社区安防等领域得到越来越广泛的应用.摄像头直播视频监控通过网络直接连接,可达到的世界任何角 ...
- 【python基础】Python性能加速的方法
参考 1. 给Python加速(性能加速的方法); 2. pythonSpeed_PerformanceTips; 完
- teamviewer破解版
简介 TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制的应用程序,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamView ...
- Google Drive网盘文件直链获取一键脚本
说明:本脚本可以将Google Drive网盘的文件分享链接或者文件ID变成直链,方便我们在很多情况下调用.只支持文件分享,不支持文件夹.文件分享ID为26到48位. 使用 1.需求 wget.g ...
- windwos 安装 vue-cli
安装vue-cli 安装之前我们需要先安装node.js以及包管理工具npm,有兴趣的可以安装nvm版本管理工具 地址:https://www.cnblogs.com/lph970417/p/1184 ...
- Influx Sql系列教程五:insert 添加数据
接下来开始进入influxdb的curd篇,首先我们看一下如何添加数据,也就是insert的使用姿势 在进入本篇之前,对于不了解什么是retention policy, tag, field的同学,有 ...
- sftp服务器的搭建
## 搭建前言: 主机系统:centos7 由于sftp基于ssh协议,所以我们无需安装多余的包,只需要进行相应的配置即可. ## 搭建过程: 1. 创建用户.用户组,设置目录权限等( ...
- WordPress 设计学习
"One can never be defeated until defeat has been accepted as a reality"----- Bruce Lee 官网免 ...
- flask框架(六)——闪现(get_flashed_message)、请求扩展、中间件(了解)
message -设置:flash('aaa') -取值:get_flashed_message() -假设在a页面操作出错,跳转到b页面,在b页面显示a页面的错误信息 1 如果要用flash就必须设 ...