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的链表实现的更多相关文章

  1. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

  5. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  6. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  7. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  8. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  9. 用JavaScript来实现链表LinkedList

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...

  10. 数据结构:队列 链表,顺序表和循环顺序表实现(python版)

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

随机推荐

  1. Docker 搭建本地 cnpm 私有仓库

    1.首先启动本地的docker 2.下载 cnpm 仓库 git clone https://github.com/cnpm/cnpmjs.org.git 3.进入到 cnpmjs.org目录 cd ...

  2. Oracle-关于Oracle.ManagedDataAccess

    今天调用webservice的时候,运行程序后开始报错以下的错误信息 “/”应用程序中的服务器错误. 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项.试图加载格式不正确的 ...

  3. nvm安装、解决nvm command not found问题、卸载

    安装 nvm是node的包版本管理工具,github地址如下:nvm 安装命令 1 curl -o- https://raw.githubusercontent.com/creationix/nvm/ ...

  4. spring boot @RequestBody数据传递及解析

    @RequestBody需要接的参数是一个string化的json @RequestBody,要读取的数据在请求体里,所以要发post请求,还要将Content-Type设置为application/ ...

  5. 安装 gearman

    准备:php 对应gearman插件包 https://pecl.php.net/package/gearman 1. 先安装依赖库 [root@VM_27_0_centos /]# yum inst ...

  6. SpringBoot系列教程web篇之Beetl环境搭建

    前面两篇分别介绍了目前流行的模板引擎Freemaker和Thymeleaf构建web应用的方式,接下来我们看一下号称性能最好的国产模板引擎Beetl,如何搭建web环境 本文主要来自官方文档,如有疑问 ...

  7. appium 弹窗处理

    测试过程中遇到两类弹窗: 系统权限弹窗具体业务弹窗系统权限弹窗Android系统权限弹窗一般出现在安装 app 后首次打开,如:定位权限.电话权限等.我们可以按顺序执行测试用例,将该类操作放到 Ini ...

  8. 安装donkeyid

    cd /usr/local/php/include/php/ext sudo git clone https://github.com/osgochina/donkeyid.git cd /usr/l ...

  9. spring框架学习(二)——注解方式IOC/DI

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

  10. P-R曲线深入理解

    P-R曲线就是精确率precision vs 召回率recall 曲线,以recall作为横坐标轴,precision作为纵坐标轴.首先解释一下精确率和召回率. 解释精确率和召回率之前,先来看下混淆矩 ...