一个链表实现,函数声明放在 list.h 头文件汇总,函数定义放在list.cpp 中,main.cpp 用来测试各个函数.

1.文件list.h

// list.h

#ifndef  __LIST_H_
#define __LIST_H_ typedef char EleType; //定义链表存储的数据类型 //链表节点结构
typedef struct node
{
EleType data;
struct node * next;
}ChainNode; //头结点
typedef struct {
ChainNode* head;
} List; List* CreateList(); //创建链表
void DestoryLIst(List* ); //删除链表
void ClearList(List* );
int ListAppend(List*, EleType); //追加元素
int ListInsert(List*, int, EleType); //插入元素
int ListDelete(List*, int); //删除元素
int GetElememt(List*, int, EleType *); //取元素
ChainNode* GetAddr(List*,int ); //取元素地址
ChainNode* NewChainNode(EleType); //创建一个元素节点
int TraverseList(List*, int(*) (EleType*) ); //遍历元素
void ShowList(List*);
int PrintElement(EleType *);
#endif
  1. 文件list.cpp
// list.cpp

#include "list.h"
//#include<stdio.h>
#include <iostream>
using namespace std; //创建链表,仅有头结点
List* CreateList()
{
List* p = new List;
EleType data = (EleType)0;
p->head = NewChainNode(data);
if(NULL != p && NULL !=p->head)
{
p->head->data = data;
p->head->next = NULL;
return p;
}
cout<<"分配内存失败"<<endl;
return NULL;
} //删除链表
void DestoryLIst(List* lp)
{
if(NULL != lp)
{
ClearList(lp);
delete lp;
}
} //清空链表
void ClearList(List* lp)
{
if(NULL != lp)
{
while(ListDelete(lp, 1) );
} } //追加元素
int ListAppend(List* lp, EleType ele)
{
ChainNode* p=NULL;
ChainNode* newp= NewChainNode(ele);
if(NULL != lp && NULL != newp)
{
for(p=lp->head; p->next; p=p->next);
p->next = newp;
return 1;
}
return 0;
} //插入元素
int ListInsert(List* lp, int n, EleType ele)
{
ChainNode* p=NULL;
ChainNode* newp= NewChainNode(ele); if(NULL != lp && NULL != newp)
{
p = GetAddr(lp, n-1);
newp->next = p->next;
p->next = newp;
return 1;
}
return 0;
} //删除元素
int ListDelete(List* lp, int n)
{
ChainNode* temp = NULL;
if(NULL != lp && NULL != lp->head->next)
{
temp = GetAddr(lp, n-1);
if(NULL != temp && NULL != temp->next)
{
temp->next = temp->next->next;
return 1;
}
}
return 0;
} //取元素
int GetElememt(List* lp, int n, EleType * ele)
{
ChainNode* p = NULL;
if(NULL != lp && NULL != lp->head->next)
{
p =GetAddr(lp, n-1);
if(NULL != p)
{
*ele = p->data;
return 1;
}
}
return 0;
} //取元素地址
ChainNode* GetAddr(List* lp,int n )
{
if(n >= 0)
{
ChainNode* p = lp->head;
if(NULL != lp && NULL != p->next)
{
int i = 0;
while(NULL !=p && i<n)
{
p = p->next;
i++;
}
return p;
}
}
cout<<"n应该为非负数"<<endl;
return NULL;
} //创建一个元素节点
ChainNode* NewChainNode(EleType ele)
{
ChainNode* p =new ChainNode;
if(p != NULL)
{
p->data = ele;
p->next = NULL; }
return p;
} //遍历元素
int TraverseList(List* lp, int (*f) (EleType *) )
{
if(NULL != lp)
{
ChainNode* p = lp->head->next;
int i =0;
for( ; NULL != p; p= p->next)
{
if( !f(&(p->data)) )
{
return i+1;
}
i++;
}
return 0; } } void ShowList(List* lp)
{
TraverseList(lp, PrintElement);
cout<<endl;
} int PrintElement(EleType *data)
{
cout<<" "<<*data;
return 1;
}
  1. 文件main.cpp
// main.cpp

#include "list.h"
#include <iostream>
using namespace std; int main()
{
char arr[20] ="hello world"; List* lp = CreateList();
if(NULL ==lp ) return 0;
for(int i = 0; arr[i]; i++)
{
ListAppend(lp,arr[i]);
}
ShowList(lp); ListAppend(lp,'o');
ListAppend(lp,'v');
ListAppend(lp,'r');
ListAppend(lp,'y');
ShowList(lp); ListInsert(lp,1,'a');
ListInsert(lp,2,'b');
ShowList(lp); ListDelete(lp,1);
ShowList(lp);
ListDelete(lp,1);
ShowList(lp); return 0;
}

链表的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. Python2.7-ConfigParser

    ConfigParser模块,用于读写配置文件,配置文件是由各个 section 组成的,每个部分都有一个 [section] 头指示,后面紧跟这部分里的配置信息,一般为 name: value 或 ...

  2. Python:基础知识

    python是一种解释型.面向对象的.带有动态语义的高级程序语言. 一.下载安装 官网下载地址:https://www.python.org/downloads 下载后执行安装文件,按照默认安装顺序安 ...

  3. HDU 3072 Intelligence System(tarjan染色缩点+贪心+最小树形图)

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. 软件设计、DDD概念及落地时的一些零碎思考和记录2

    主要是项目中一些落地经验和记录 技术人员.开发人员 大部分程序员真的不善于沟通,经常会显得很保守: 他们技术上的困惑.误解乃至郁闷都很难直接的表达清楚: 他们对自己的错误"印象"很 ...

  5. 2017-2018-2 20155203《网络对抗技术》 Exp8:Web基础

    基础问题回答 (1)什么是表单 我认为,form概念主要区分于table,table是用网页布局设计,是静态的,form是用于显示和收集信息传递到服务器和后台数据库中,是动态的: 以下是表单的百度百科 ...

  6. 20155323刘威良《网络对抗》Exp9 Web安全基础

    20155323刘威良<网络对抗>Exp9 Web安全基础 实践目的 理解常用网络攻击技术的基本原理. 实践内容 Webgoat实践下相关实验. 实践过程 开启WebGoat WebGoa ...

  7. 新员工入门 - for测试

    23456人员介绍 XXX 测试工作 [软件] Chrome 浏览器.jsonviewer.Firefox.FireBug HTTP协议与抓包 - fildder.wireshirk等 DB查询工具 ...

  8. HTML 表格实例

    1.表格这个例子演示如何在 HTML 文档中创建表格. <p>每个表格由 table 标签开始.</p><p>每个表格行由 tr 标签开始.</p>&l ...

  9. 2018-07-09--记录一次gitlab迁移事件及遇到的问题

    一.事情起因 因机房服务器即将到期,需要将即将到期的服务器迁移至云上,迁移之前没有查看老环境的Gitlab是什么版本,直接装的Gitlab社区版,做数据导入时提示版本错误: [root@vpn-ser ...

  10. NO--12模拟服务器端请求之node.js

    最近几天项目上线,工作比较忙,没时间更博了,好在今天有点时间并且同事问道我一个问题,正好一块解决 使用 Vue 写项目肯定会遇到一个问题,如何模拟服务端请求数据,那这就需要用到 node.js 了. ...