//链表的基本用法代码实现
/************************************************************************/
/* Created: 2014-03-02
/* Author: http://weibo.com/3088919800/profile
/************************************************************************/ #include "stdio.h"
#include "stdlib.h" struct ListNode
{
int value;
ListNode * next;
}; ListNode* CreateListNode(const int& nNodeValue)
{
ListNode* pNode; pNode = (ListNode*)malloc(sizeof(ListNode));
if (!pNode)
return NULL; pNode->value = nNodeValue;
pNode->next = NULL;
return pNode;
} //we need the head node value.
ListNode * CreateList(const int& nListHeadVal)
{
ListNode * li;
li = CreateListNode(nListHeadVal);
if (!li)
return NULL;
return li;
} //free all nodes in the list
void FreeList(ListNode *li)
{
ListNode * pListNode, *pTmpNode;
pListNode = li;
while (pListNode)
{
pTmpNode = pListNode;
pListNode = pListNode->next;
free(pTmpNode);
}
li = NULL;
} ListNode* AppendNode(ListNode* pList, const int &nVal)
{
ListNode* node;
ListNode* header; node = CreateListNode(nVal); if (!node)
return pList; header = pList;
if (!header)
return node; header = pList; while(header->next)
header = header->next; header->next = node; return pList;
} //if find return the node, else return null
ListNode* Find(ListNode* pList, const int& nVal)
{
ListNode* pListNode = NULL; pListNode = pList; while (pListNode)
{
if (pListNode->value == nVal)
break;
pListNode = pListNode->next;
} return pListNode;
} //insert decreasing 增减
ListNode* Insert(ListNode* pList, const int& nVal)
{ ListNode * pNewNode = NULL;
ListNode* pIterNode = NULL; pNewNode = CreateListNode(nVal);
if (!pNewNode)
return pList; if (!pList)
return pNewNode; pIterNode = pList;
while (pIterNode->value > nVal && pIterNode->next && pIterNode->next->value > nVal)
pIterNode = pIterNode->next; //if true ,it is the first node
if (pIterNode->value <= nVal)
{
pNewNode->next = pIterNode;
return pNewNode;
} if (pIterNode->next)
pNewNode->next = pIterNode->next; pIterNode->next = pNewNode; return pList;
} //insert Ascending,递增
ListNode* Insert2(ListNode* pList, const int& nVal)
{ ListNode * pNewNode = NULL;
ListNode* pIterNode = NULL; pNewNode = CreateListNode(nVal);
if (!pNewNode)
return pList; if (!pList)
return pNewNode; pIterNode = pList; while (pIterNode->value < nVal && pIterNode->next && pIterNode->next->value < nVal)
pIterNode= pIterNode->next; //if true ,it is the first node
if (pIterNode->value > nVal)
{
pNewNode->next = pIterNode;
return pNewNode;
} // insert the node.
if (pIterNode->next)
pNewNode->next = pIterNode->next;
pIterNode->next = pNewNode;
return pList;
} void PrintList(ListNode* list)
{
ListNode* pIterNode; pIterNode = list;
while (pIterNode)
{
printf("%d ", pIterNode->value);
pIterNode = pIterNode->next;
}
}
//链表倒置
ListNode* InvertList(ListNode* list)
{
ListNode *pIterNode, *pNewHead, *pTmpNode; pTmpNode = list;
if (!pTmpNode || !(pTmpNode->next))
return list; pNewHead = list;
pIterNode = list; while(pIterNode->next)
{
pTmpNode = pIterNode->next->next;
pIterNode->next->next = pNewHead;
pNewHead = pIterNode->next;
pIterNode->next = pTmpNode;
} return pNewHead;
} int main(int argc, char* argv[])
{
ListNode* list = CreateList(); ListNode* pNode;
if (!list)
{
printf("create list error!");
exit(-);
} int i = ; for (int i = ; i< ; i++)
{
list = Insert2(list, i);
} printf("\nAfter insert list: \n");
PrintList(list); list = InvertList(list);
printf("\nAfter invert the list\n");
PrintList(list); //test find .
pNode = Find(list, );
if (pNode)
{
printf("\nfind it:%d\n", pNode->value);
}
else
{
printf("\nnot find it:%d\n", );
} //free all the list node
FreeList(list); getchar();
return ;
}

c/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. Vue打包上线之后CSS没有压缩和不生效

    前言 当用vue-cli 脚手架 打包压缩时,发现打包出来的css 没有被压缩, 所以查阅了些资料,下面用这个方法解决: 1.首先注释掉webpack.prod.conf.js中下面的代码 new O ...

  2. Nginx动静分离经典案例配置

    随着Nginx高性能Web服务器大量被使用,目前Nginx最新稳定版为1.2.6,张宴兄在实际应用中大量使用Nginx,并分享Nginx高性能Web服务器知识,使得Nginx在国内也是飞速的发展.那今 ...

  3. dirname命令和basename命令

    dirname返回文件所在目录路径,而basename则相反,去掉路径返回最后的文件名. direname: 用途 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的 ...

  4. 一个简单的ETL脚本的内容

    一个简单的ETL脚本应该包含如下内容 1.注释 2.设置字符集 3.基础路径参数 脚本路径 票据路径 日志路径 当前SHELL的脚本别名:declare SHELL_NAME=“${basename ...

  5. 使用CEfSharp之旅 前后端访问代码

    1.引入CEfSharp newget包 2.把平台配置为X86或X64,any cpu不支持此控件 3.引入命名空间 using CefSharp; using CefSharp.WinForms; ...

  6. 绑定与非绑定方法及反射,isinstance和issubclass内置函数

    目录 绑定方法与非绑定方法 1.绑定方法 2.非绑定方法(staticmethod) isinstance和issubclass 内置函数 1.isinstance 2.issubclass 反射(面 ...

  7. vs code 写VUE代码 注释 html出现 //

    装个插件 "Vuter" 解决

  8. 关于C#的学习

    长期以来对C#的认识一直停留在微软件开发的完全面向对象的语言的模糊印象上,对其工程也缺乏多文件以上级别的修改能力,而当前流行度的驱使下,想深入了解它并运用. 于是从git上下载了一个C#开源项目,打开 ...

  9. 51 Nod 1073 约瑟夫环

    1073 约瑟夫环  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人 ...

  10. fiddler(三)、会话框添加显示请求方法栏

    在使用fiddler抓包的时候,查看请求类型get和post每次只有点开该请求,在Inspectors才能查看get和post请求,不太方便.如果在会话框能直观地查看到请求方式,那就好了! 一.添加会 ...