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) 循环顺序表实现队列 ...
随机推荐
- 基因型数据正负链怎么翻转(snp flip)
在合并数据过程当中,经常会发现不同来源的数据正负链不是统一的,这是一件很头疼的事. 正负链没有统一的情况下直接合并在一起会产生什么后果呢. 举个最简单的例子,假如我们从小明和小红分别拿到了一批基因型数 ...
- Spring Boot拦截器实现并和swagger集成后使用拦截器的配置问题
1. 定义拦截器 LoginInterceptor LoginInterceptor.java是整个登录认证模块中的核心类之一,它实现了HandlerInterceptor类,由它来拦截并过滤到来的每 ...
- 学习记录-java基础部分(一)
学习记录-java基础部分(一) 参考:GitHub上的知名项目:javaGuide : https://github.com/Snailclimb/JavaGuide/blob/master/doc ...
- 第07组 Beta冲刺(2/4)
队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...
- python实践项目四:猜数字游戏
题目要求:在1-20中随机生成一个数字,你来猜,只有6次机会. 举例一: #!/usr/bin/python # -*- coding: UTF-8 -*- import random secretN ...
- python 数据库导入excel
import MySQLdb import xlwt def outMySQL(file_name): wb = xlwt.Workbook() sh = wb.add_sheet('sheet 1' ...
- UE项目打包
https://docs.unrealengine.com/zh-CN/Engine/Basics/Projects/Packaging/index.html 必须先对虚幻项目进行正确打包,之后才能将 ...
- 喜马拉雅 FM 已购付费音频下载
如何下载在喜马拉雅 FM 中已购买的付费音频.之前想分享自己购买的付费音频给朋友听,碍于喜马拉雅 FM 的音频不能直接导出,所以准备自己搞个下载的小软件. 仅可下载已购买的付费音频.当然,如果你是会员 ...
- Docker部署ELK 7.0.1集群之Elasticsearch安装介绍
elk介绍这里不再赘述,本系列教程多以实战干货为主,关于elk工作原理介绍,详情查看官方文档. 一.环境规划 主机名 IP 角色 节点名 centos01 10.10.0.10 es node-10 ...
- 通过Anaconda安装的jupyter notebook,打开时,未能启动默认浏览器
问题:通过Anaconda安装的jupyter notebook,通过开始菜单的快捷方式打开时,未能启动网页,需要复制url,粘贴到浏览器中才会出现工作面板. 解决方法: 修改jupyter_note ...