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. [LeetCode] 264. Ugly Number II 丑陋数 II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  2. [LeetCode] 687. Longest Univalue Path 最长唯一值路径

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...

  3. python:找出两个列表中相同和不同的元素(使用推导式)

    #接口返回值 list1 = ['张三', '李四', '王五', '老二'] #数据库返回值 list2 = ['张三', '李四', '老二', '王七'] a = [x for x in lis ...

  4. 通过 PECL 安装 PHP 扩展(以 CentOS7 中安装 swoole 为例)

    原文地址:https://blog.csdn.net/kikajack/article/details/82495190 常用工具PECL 和 phpize官网文档 PHP 有大量的扩展可以使用,比如 ...

  5. ProtoStuff无法反序列化Deprecated注解成员问题记录

    在开发过程中,遇到一个鬼畜的问题,在DO的某个成员上添加@Deprecated注解之后,通过ProtoStuff反序列化得到的DO中,这个成员一直为null:花了不少时间才定位这个问题,特此记录一下 ...

  6. JAVA windows环境配置,jdk的安装配置

    一.需要的文件与下载1.jdk:jdk下载:二.安装与配置1.jdk安装与路径选择 双击安装,然后一直下一步,直至完成. 这是个人的自定义的安装目录路径(安装路径可在安装的时候自行选择,) 2.jdk ...

  7. saltstack配置文件详解

    软件依赖 Python版本大于2.6或版本小于3.0: 对Python版本要求 msgpack-python: SalStack消息交换库 YAML: SaltStack配置解析定义语法 Jinja2 ...

  8. GroupBy之后加ToList和不加ToList有什么区别吗?

        class Program    {        static void Main(string[] args)        {             List<Person> ...

  9. centos6.5上安装5.7版本的mysql

    centos6.5上安装5.7版本的mysql https://www.cnblogs.com/lzj0218/p/5724446.html 设置root可以在本机以外的机器访问 mysql -uro ...

  10. pom.xml文件导入了坐标,也没有报错,为什么还是没有相关的jar包的?

    为什么会出现这样的错误呢?仔细想了想,赶紧去本地仓库看看jar也没有导入进来 解决问题的思路,就是把假的jar包文件删除掉,然后在IDEA上的坐标复制删除粘贴,IDEA就会重新导入jar包,这时就成功 ...