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. 基因型数据正负链怎么翻转(snp flip)

    在合并数据过程当中,经常会发现不同来源的数据正负链不是统一的,这是一件很头疼的事. 正负链没有统一的情况下直接合并在一起会产生什么后果呢. 举个最简单的例子,假如我们从小明和小红分别拿到了一批基因型数 ...

  2. Spring Boot拦截器实现并和swagger集成后使用拦截器的配置问题

    1. 定义拦截器 LoginInterceptor LoginInterceptor.java是整个登录认证模块中的核心类之一,它实现了HandlerInterceptor类,由它来拦截并过滤到来的每 ...

  3. 学习记录-java基础部分(一)

    学习记录-java基础部分(一) 参考:GitHub上的知名项目:javaGuide : https://github.com/Snailclimb/JavaGuide/blob/master/doc ...

  4. 第07组 Beta冲刺(2/4)

    队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...

  5. python实践项目四:猜数字游戏

    题目要求:在1-20中随机生成一个数字,你来猜,只有6次机会. 举例一: #!/usr/bin/python # -*- coding: UTF-8 -*- import random secretN ...

  6. python 数据库导入excel

    import MySQLdb import xlwt def outMySQL(file_name): wb = xlwt.Workbook() sh = wb.add_sheet('sheet 1' ...

  7. UE项目打包

    https://docs.unrealengine.com/zh-CN/Engine/Basics/Projects/Packaging/index.html 必须先对虚幻项目进行正确打包,之后才能将 ...

  8. 喜马拉雅 FM 已购付费音频下载

    如何下载在喜马拉雅 FM 中已购买的付费音频.之前想分享自己购买的付费音频给朋友听,碍于喜马拉雅 FM 的音频不能直接导出,所以准备自己搞个下载的小软件. 仅可下载已购买的付费音频.当然,如果你是会员 ...

  9. Docker部署ELK 7.0.1集群之Elasticsearch安装介绍

    elk介绍这里不再赘述,本系列教程多以实战干货为主,关于elk工作原理介绍,详情查看官方文档. 一.环境规划 主机名 IP 角色 节点名 centos01 10.10.0.10 es node-10 ...

  10. 通过Anaconda安装的jupyter notebook,打开时,未能启动默认浏览器

    问题:通过Anaconda安装的jupyter notebook,通过开始菜单的快捷方式打开时,未能启动网页,需要复制url,粘贴到浏览器中才会出现工作面板. 解决方法: 修改jupyter_note ...