惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
量子位
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
有赞技术团队
有赞技术团队
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
GbyAI
GbyAI
雷峰网
雷峰网
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
V
Visual Studio Blog
C
Check Point Blog
爱范儿
爱范儿
罗磊的独立博客
Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
H
Help Net Security
B
Blog
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 叶小钗
B
Blog RSS Feed
Cisco Talos Blog
Cisco Talos Blog
S
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tor Project blog
TaoSecurity Blog
TaoSecurity Blog
Scott Helme
Scott Helme
AI
AI
D
DataBreaches.Net
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Last Week in AI
Last Week in AI
T
Threatpost
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
Know Your Adversary
Know Your Adversary
T
Tailwind CSS Blog
N
News and Events Feed by Topic
N
News and Events Feed by Topic
The Hacker News
The Hacker News
P
Proofpoint News Feed

青空之蓝

[青空之蓝-2023] - 色彩 | 青空之蓝 [青空之蓝-2022] - 平静 | 青空之蓝 [青空之蓝-2021] - 远望 | 青空之蓝 浅谈垃圾回收 | 青空之蓝 浅谈泛型擦除 | 青空之蓝 浅谈单点登录 | 青空之蓝 使用 Kotlin 编写 Spring 测试 | 青空之蓝 设计模式系列文章 | 青空之蓝 从零实现一个 Java 微框架 - IoC | 青空之蓝 从零实现一个 Java 微框架 - 前言 | 青空之蓝 浅谈 JVM:类加载 | 青空之蓝 浅谈 IO | 青空之蓝 浅谈并发:synchronized & ReentrantLock | 青空之蓝 浅谈并发:CAS & AQS | 青空之蓝 浅谈并发:ThreadLocal | 青空之蓝 浅谈并发:三大特性 | 青空之蓝 浅谈组合注解 & 注解别名 | 青空之蓝 [青空之蓝-2020]-迷茫 | 青空之蓝 Java 系列文章 | 青空之蓝 HTTP 系列文章 | 青空之蓝 浅谈 EatWhatYouKill | 青空之蓝 浅谈可扩展线程池 | 青空之蓝 聊聊写框架 | 青空之蓝 聊聊现状-[2020-09] | 青空之蓝 浅谈并发:锁 | 青空之蓝 浅谈并发:基础 | 青空之蓝 浅谈缓存 | 青空之蓝 无须定义类,Spring 快速注入 Json 参数 | 青空之蓝 浅谈 Proxy 和 Aop | 青空之蓝 从零实现一个 PHP 微框架 - 初始化请求 | 青空之蓝 为 Vue3 添加一个简单的 Store | 青空之蓝 从零实现一个 PHP 微框架 - 服务提供者 | 青空之蓝 WSL2 踩坑记录 | 青空之蓝 浅谈浏览器Event Loop [更新] | 青空之蓝 从零实现一个 PHP 微框架 - Bootstrap 启动加载 | 青空之蓝 从零实现一个 PHP 微框架 - IoC 容器 | 青空之蓝 从零实现一个 PHP 微框架 - PSR & Composer | 青空之蓝 从零实现一个 PHP 微框架 - 前言 | 青空之蓝 MVVM 简单实现 | 青空之蓝 浅谈 DI 和 IoC | 青空之蓝 中间件实现 [PHP] | 青空之蓝 告别 Windows 终端的难看难用,打造好用的 PowerShell | 青空之蓝 VSCode Java输出中文乱码问题解决[更新] | 青空之蓝 浅谈浏览器渲染 | 青空之蓝 Vue-Cli@2 项目迁移日志 | 青空之蓝 Laragon & Scoop 集成踩坑记录 | 青空之蓝 「一行代码」优雅管理 Windows 软件 | 青空之蓝 [青空之蓝-2019]-年度总结 | 青空之蓝 为Vue添加简单的Store | 青空之蓝 为React添加简单的Store | 青空之蓝 为Vuex添加同步Action | 青空之蓝 浅谈B+树 | 青空之蓝 浅谈跳表 | 青空之蓝 浅谈数据库索引 | 青空之蓝 MySQL事务隔离 | 青空之蓝 算法复杂度分析(1) | 青空之蓝 一年来的经验总结 | 青空之蓝 Acrylic - VSCode Extension | 青空之蓝 ace编辑器设置惯性滚动 | 青空之蓝 Java二叉树实现 | 青空之蓝 Java图实现 | 青空之蓝 为apt方式安装的nginx重新编译增加WebDAV | 青空之蓝 XK-Editor - 一个支持富文本和Markdown的编辑器 | 青空之蓝 JS生成列表树 | 青空之蓝 Laravel生成目录树 | 青空之蓝 XK-Note - 集各种神奇功能的云笔记 | 青空之蓝 PHP GD生成验证码 | 青空之蓝 PHP GD图片处理[转换格式-水印-缩略图] | 青空之蓝 Origami - 简洁轻快的WordPress主题 | 青空之蓝 为WordPress启用WorkBox | 青空之蓝 [青空之蓝-2018]-年度总结 | 青空之蓝 VSCode Java手动导入jar和源码包 | 青空之蓝 Windows IP变化自动发送邮件 | 青空之蓝 C链表实现重制版 | 青空之蓝 C 结构体的定义和使用 | 青空之蓝 图的搜索(遍历) - BFS & DFS | 青空之蓝 Java链表实现 | 青空之蓝 C 快速排序 | 青空之蓝 C 插入排序 | 青空之蓝 C 归并排序 | 青空之蓝 VSCode配置Java调试环境[Windows] | 青空之蓝 C 选择排序 | 青空之蓝 C 冒泡排序 | 青空之蓝 VSCode配置PHP调试环境[Windows] | 青空之蓝 VSCode配置C/C++ GDB调试环境[Windows] | 青空之蓝 WordPress友情链接模板 | 青空之蓝 Intel Optane 傲腾内存体验 | 青空之蓝 Mysql双机热备实战 | 青空之蓝 博客一年记录 | 青空之蓝 为WordPress启用Service Worker | 青空之蓝 Bing每日一图API | 青空之蓝 iframe延迟加载 | 青空之蓝 写在2018年高考前 | 青空之蓝 The Fox主题汉化分享 | 青空之蓝 [青空之蓝-2017]-崭新 | 青空之蓝 本博客评论规则 | 青空之蓝 世界,您好! | 青空之蓝
C语言链表实现 | 青空之蓝
Otstar Lin · 2018-11-12 · via 青空之蓝

先放代码,开一波坑,以后慢慢填ヾ(≧▽≦*)o

由于我在上传的时候未进行完整测试,导致排序部分有些问题,现已修改完成。

另外排序部分只弄了 int 型的排序

改指针相关的东西真头真疼,特别是链表,折腾了一个多小时。〒 ▽ 〒

重写升级完成,这个算法目前除了排序还有用其他就没有用了,可以点这里直接跳转到重制版

#include <stdio.h>
#include <malloc.h>
//链表结构
typedef struct Test
{
    int data;
    struct Test *next;
}Test,*pTest;

//头插法-创建
pTest Create_Head(int n/*链表包含节点个数*/)
{
    int i,data;
    pTest list,node;
    //创建头节点
    list = (pTest)malloc(sizeof(Test));
    list->next = NULL;
    for(i=0;i<n;i++)
    {
        //创建临时节点
        node = (pTest)malloc(sizeof(Test));
        //读入数据
        printf("请输入第%d个数据\n",i+1);
        scanf("%d",&data);
        //将数据存入临时节点的数据域中
        node->data = data;
        //将list头节点的next指针复制到node头节点的next指针
        node->next = list->next;
        //将node链表指针结合到list头节点的next指针
        list->next = node;
    }
    //初始化头节点数据
    list->data = 0;
    return list;
}

//尾插法-创建
pTest Create_End(int n/*链表包含节点个数*/)
{
    int i,data;
    pTest list,node,p;
    //创建头节点
    list = (pTest)malloc(sizeof(Test));
    list->next = NULL;
    //将副本链表指向list用来间接为list指针域赋值
    p = list;
    for(i=0;i<n;i++)
    {
        //创建临时节点
        node = (pTest)malloc(sizeof(Test));
        //读入数据
        printf("请输入第%d个数据\n",i+1);
        scanf("%d",&data);
        //将数据存入临时节点数据域
        node->data = data;
        //将副本最后的指针域指向临时节点
        p->next = node;
        //将临时节点的指针域置NULL
        node->next = NULL;
        //移动副本节点使最新的指针域成为副本链表的最后一个
        while(p->next != NULL)
        {
            p = p->next;
        }
    }
    //初始化头节点数据
    list->data = 0;
    return list;
}

//添加节点至指定位置
pTest Insert_pos(int i/*要添加到什么位置*/,pTest list/*要进行添加节点的链表*/)
{
    int data;
    pTest node,p,temp;
    //创建list链表的副本
    p = list;
    //修改位置为实际位置
    i = i - 1;
    //调整链表指针域位置,临时链表的头节点到达要添加的节点的上一个节点
    for(int u = 0; u < i; u++)
    {
        p = p->next;
    }
    //创建临时节点
    node = (pTest)malloc(sizeof(Test));
    temp = (pTest)malloc(sizeof(Test));
    //读入数据
    printf("请输入第%d个数据\n",i+1);
    scanf("%d",&data);
    //读入数据到临时节点的数据域
    node->data = data;
    //将目前节点的next即下一个节点的地址临时存起来
    temp->next = p->next;
    //把目前节点的next改为node节点,即进行插入
    p->next = node;
    //将node的next改为之前没修改时的下一个节点地址
    node->next = temp->next;
    //返回修改好的链表
    return list;
}

//添加已经拥有数据的节点
pTest Insert_pos_own(int i/*要添加到什么位置*/,pTest list/*要进行添加节点的链表*/,pTest node)
{
    int data;
    pTest p,temp;
    //创建list链表的副本
    p = list;
    //修改位置为实际位置
    i = i - 1;
    //调整链表指针域位置,临时链表的头节点到达要添加的节点的上一个节点
    for(int u = 0; u < i; u++)
    {
        p = p->next;
    }
    //创建临时节点
    temp = (pTest)malloc(sizeof(Test));
    //将目前节点的next即下一个节点的地址临时存起来
    temp->next = p->next;
    //把目前节点的next改为node节点,即进行插入
    p->next = node;
    //将node的next改为之前没修改时的下一个节点地址
    node->next = temp->next;
    //返回修改好的链表
    return list;
}

//删除指定位置的节点
pTest Delete_pos(int i/*要删除第几个节点*/,pTest list/*要进行删除节点的链表*/)
{
    pTest p,temp;
    //创建临时节点
    temp = (pTest)malloc(sizeof(Test));
    p = list;
    //调整实际位置
    i = i - 1;
    //调整链表指针域位置,临时链表的头节点到达要删除的节点的上一个节点
    for(int u = 0; u < i; u++)
    {
        p = p->next;
    }
    //将要删除的节点的下一个节点的地址存入temp的指针域
    temp = p->next->next;
    //将temp的指针域赋给要删除节点的指针域
    p->next = temp;
    //free(temp);
    //返回修改后的链表
    return list;
}

//清空链表,保留头节点
pTest Clear_List(pTest list)
{
    pTest p = list->next; //移动到第一个结点
    pTest q;
    while(p) {
        //printf("%d\t", p->data);
        q = p;
        p = p->next;
        free(q);
    }
    list->next = NULL;
    return list;
}

//遍历链表
pTest Print_List(pTest list)
{
    pTest p;
    p = list->next; //移动到存放真实数据的第一个结点
    while(p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

//链表逆置
pTest Resever(pTest list)
{
    pTest p, q, r;
    p = list;//P指向头结点
    q = p->next; //q指向第一个结点
    while(q->next) {
        r = q->next;
        q->next = p;
        p = q;
        q = r;
    }
    q->next = p; //连上最后一个结点
    p = list->next;
    p->next = NULL; //收尾
    list->next = q; //赋头
    return list;
}

//链表排序-从小到大
pTest Bubble_Sort(pTest list)
{
    //定义排序个数和下标的变量
    int n = 0, i, j, k;
    //定义判断链表个数的链表和用来判断大小的链表
    pTest p = list, temp;
    //判断链表的个数
    for(;p->next!=NULL;p = p->next)
    {
        n++;
    }
    //外层循环控制循环轮数
    for(i = 0; i < n; i++)
    {
        //内层循环控制每轮比较次数
        for(j = 0; j < n; j++)
        {
            //遍历比较相邻链表数据的大小
            temp = list;
            //移动比较用的链表
            for(k=0;k<j;k++)
            {
                temp = temp->next;
            }
            if(temp->data > temp->next->data)
            {
                //交换的方式是先删除大数据的节点,然后在添加回链表
                //删除大数据的节点
                list = Delete_pos(j,list);
                //将删除后的节点添加会链表的下一个节点
                list = Insert_pos_own(j+1,list,temp);
            };
        }
    }
    return list;
}

int main()
{
    pTest list = Create_End(5);
    list = Bubble_Sort(list);
    return 0;
}
#include <stdio.h>
#include <malloc.h>
//链表结构
typedef struct Test
{
    int data;
    struct Test *next;
}Test,*pTest;

//头插法-创建
pTest Create_Head(int n/*链表包含节点个数*/)
{
    int i,data;
    pTest list,node;
    //创建头节点
    list = (pTest)malloc(sizeof(Test));
    list->next = NULL;
    for(i=0;i<n;i++)
    {
        //创建临时节点
        node = (pTest)malloc(sizeof(Test));
        //读入数据
        printf("请输入第%d个数据\n",i+1);
        scanf("%d",&data);
        //将数据存入临时节点的数据域中
        node->data = data;
        //将list头节点的next指针复制到node头节点的next指针
        node->next = list->next;
        //将node链表指针结合到list头节点的next指针
        list->next = node;
    }
    //初始化头节点数据
    list->data = 0;
    return list;
}

//尾插法-创建
pTest Create_End(int n/*链表包含节点个数*/)
{
    int i,data;
    pTest list,node,p;
    //创建头节点
    list = (pTest)malloc(sizeof(Test));
    list->next = NULL;
    //将副本链表指向list用来间接为list指针域赋值
    p = list;
    for(i=0;i<n;i++)
    {
        //创建临时节点
        node = (pTest)malloc(sizeof(Test));
        //读入数据
        printf("请输入第%d个数据\n",i+1);
        scanf("%d",&data);
        //将数据存入临时节点数据域
        node->data = data;
        //将副本最后的指针域指向临时节点
        p->next = node;
        //将临时节点的指针域置NULL
        node->next = NULL;
        //移动副本节点使最新的指针域成为副本链表的最后一个
        while(p->next != NULL)
        {
            p = p->next;
        }
    }
    //初始化头节点数据
    list->data = 0;
    return list;
}

//添加节点至指定位置
pTest Insert_pos(int i/*要添加到什么位置*/,pTest list/*要进行添加节点的链表*/)
{
    int data;
    pTest node,p,temp;
    //创建list链表的副本
    p = list;
    //修改位置为实际位置
    i = i - 1;
    //调整链表指针域位置,临时链表的头节点到达要添加的节点的上一个节点
    for(int u = 0; u < i; u++)
    {
        p = p->next;
    }
    //创建临时节点
    node = (pTest)malloc(sizeof(Test));
    temp = (pTest)malloc(sizeof(Test));
    //读入数据
    printf("请输入第%d个数据\n",i+1);
    scanf("%d",&data);
    //读入数据到临时节点的数据域
    node->data = data;
    //将目前节点的next即下一个节点的地址临时存起来
    temp->next = p->next;
    //把目前节点的next改为node节点,即进行插入
    p->next = node;
    //将node的next改为之前没修改时的下一个节点地址
    node->next = temp->next;
    //返回修改好的链表
    return list;
}

//添加已经拥有数据的节点
pTest Insert_pos_own(int i/*要添加到什么位置*/,pTest list/*要进行添加节点的链表*/,pTest node)
{
    int data;
    pTest p,temp;
    //创建list链表的副本
    p = list;
    //修改位置为实际位置
    i = i - 1;
    //调整链表指针域位置,临时链表的头节点到达要添加的节点的上一个节点
    for(int u = 0; u < i; u++)
    {
        p = p->next;
    }
    //创建临时节点
    temp = (pTest)malloc(sizeof(Test));
    //将目前节点的next即下一个节点的地址临时存起来
    temp->next = p->next;
    //把目前节点的next改为node节点,即进行插入
    p->next = node;
    //将node的next改为之前没修改时的下一个节点地址
    node->next = temp->next;
    //返回修改好的链表
    return list;
}

//删除指定位置的节点
pTest Delete_pos(int i/*要删除第几个节点*/,pTest list/*要进行删除节点的链表*/)
{
    pTest p,temp;
    //创建临时节点
    temp = (pTest)malloc(sizeof(Test));
    p = list;
    //调整实际位置
    i = i - 1;
    //调整链表指针域位置,临时链表的头节点到达要删除的节点的上一个节点
    for(int u = 0; u < i; u++)
    {
        p = p->next;
    }
    //将要删除的节点的下一个节点的地址存入temp的指针域
    temp = p->next->next;
    //将temp的指针域赋给要删除节点的指针域
    p->next = temp;
    //free(temp);
    //返回修改后的链表
    return list;
}

//清空链表,保留头节点
pTest Clear_List(pTest list)
{
    pTest p = list->next; //移动到第一个结点
    pTest q;
    while(p) {
        //printf("%d\t", p->data);
        q = p;
        p = p->next;
        free(q);
    }
    list->next = NULL;
    return list;
}

//遍历链表
pTest Print_List(pTest list)
{
    pTest p;
    p = list->next; //移动到存放真实数据的第一个结点
    while(p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

//链表逆置
pTest Resever(pTest list)
{
    pTest p, q, r;
    p = list;//P指向头结点
    q = p->next; //q指向第一个结点
    while(q->next) {
        r = q->next;
        q->next = p;
        p = q;
        q = r;
    }
    q->next = p; //连上最后一个结点
    p = list->next;
    p->next = NULL; //收尾
    list->next = q; //赋头
    return list;
}

//链表排序-从小到大
pTest Bubble_Sort(pTest list)
{
    //定义排序个数和下标的变量
    int n = 0, i, j, k;
    //定义判断链表个数的链表和用来判断大小的链表
    pTest p = list, temp;
    //判断链表的个数
    for(;p->next!=NULL;p = p->next)
    {
        n++;
    }
    //外层循环控制循环轮数
    for(i = 0; i < n; i++)
    {
        //内层循环控制每轮比较次数
        for(j = 0; j < n; j++)
        {
            //遍历比较相邻链表数据的大小
            temp = list;
            //移动比较用的链表
            for(k=0;k<j;k++)
            {
                temp = temp->next;
            }
            if(temp->data > temp->next->data)
            {
                //交换的方式是先删除大数据的节点,然后在添加回链表
                //删除大数据的节点
                list = Delete_pos(j,list);
                //将删除后的节点添加会链表的下一个节点
                list = Insert_pos_own(j+1,list,temp);
            };
        }
    }
    return list;
}

int main()
{
    pTest list = Create_End(5);
    list = Bubble_Sort(list);
    return 0;
}

C语言链表实现

https://blog.ixk.me/post/c-linked-list-implementation
  • 许可协议

    BY-NC-SA

  • 本文作者

    Otstar Lin

  • 发布于

    2018/11/12

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

C 归并排序VSCode配置Java调试环境[Windows]