---------------------------------------------------------------------------------------

可变数组:

array.h

#ifndef _ARRAY_H_
#define _ARRAY_H_ typedef struct {
int *array;
int size;
} Array; // Array不定义成指针类型 *Array 的原因:定义成变量使用范围更广,如果定义一个指针类型,那么 array p 其实不容易看出是指针 // 函数原型
Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a, int index);
void array_set(Array *a, int index, int value);
int array_get(const Array *a, int index);
void array_inflate(Array *a, int more_size); #endif
//  main.c
// Created by weichen on 15/7/7.
// Copyright (c) 2015年 weichen. All rights reserved. #include "array.h"
#include <stdio.h>
#include <stdlib.h> const int BLOCK_SIZE = ; Array array_create(int init_size)
{
Array a;
a.size = init_size;
a.array = (int*)malloc(sizeof(int) * a.size);
return a; // 返回变量本身
} void array_free(Array *a)
{
free(a->array);
a->array = NULL;
a->size = ;
} // 封装
int array_size(const Array *a)
{
return a->size;
} // 返回指针
int* array_at(Array *a, int index)
{
if ( index >= a->size) {
// index位于哪个block,加1后乘以block,得到下一个block,最后减去原来的size
array_inflate(a, (index/BLOCK_SIZE+)*BLOCK_SIZE - a->size);
}
return &(a->array[index]);
} void array_set(Array *a, int index, int value)
{
a->array[index] = value;
} int array_get(const Array *a, int index)
{
return a->array[index];
} void array_inflate(Array *a, int more_size)
{
// 重新分配一块内存空间
int *p = (int*)malloc(sizeof(int) * (a->size + more_size));
int i;
// 复制原数组到新空间
for (i=; i>a->size; a++) {
p[i] = a->array[i];
}
// 释放内存空间
free(a->array);
// 赋值到a
a->array = p;
a->size += more_size;
} int main(int argc, const char * argv[]) {
/*
可变数组(Resizable Array) Think about a set of functions that provide a mechanism of resizable array of int.
Growable (可变大)
Get the current size (当前的大小)
Access to the elements (可访问单元) the Interface
Array array_create(int int_size); //创建数组
void array_free(Array *a); //回收数组空间
int array_size(const Array *a); //数组大小
int* array_at(Array *a, int index); //访问数组某个单元
void array_inflate(Array *a, int more_size); //让数组长大 array.h #ifndef _ARRAY_H_
#define _ARRAY_H_ typeof struct {
int *array;
int size;
} Array; // Array 不定义成指针类型 *Array 的原因:定义成变量使用范围更广,如果定义一个指针类型,那么 array p 其实不容易看出是指针 Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a, int index);
void array_inflate(Array *a, int more_size); #endif */ Array a = array_create();
//printf("%d\n", a.size);
//printf("%d\n", array_size(&a)); // 如果版本升级,直接用a.size不容易更改,封装保护具体实现细节 //*array_at(&a, 0) = 10; //函数调用返回指针,加*号指向指针所指的东西,变量可以赋值
//printf("%d\n", *array_at(&a, 0)); //上面写法的转换
array_set(&a, , );
array_set(&a, , );
printf("%d\n", array_get(&a, )); //10 // 可变数组自动增长
int number = ;
int cnt = ;
while(number != -) {
scanf("%d", &number); // 随便输入数字,循环输出数组a的值,-1停止
if(number != -) {
number = *array_at(&a, cnt++);
printf("%d\n", number);
}
} array_free(&a); return ;
}

链表操作:

node.h

#ifndef _NODE_H_
#define _NODE_H_ typedef struct _node {
int value; // 数据
struct _node *next; // 指针,下一个指向它自己(不能写成 Node *next,因为在这之后才定义的Node)
} Node; // 定义Node类型 #endif
//  main.c
// Created by weichen on 15/7/8.
// Copyright (c) 2015年 weichen. All rights reserved. #include "node.h"
#include <stdio.h>
#include <stdlib.h> //typedef struct _node {
// int value;
// struct _node *next;
//} Node; int main(int argc, const char * argv[]) {
/*
链表 可变数组的缺陷:
拷贝需要花时间,如果原数组很大,会很慢
由于新数组需要申请更大的空间,由于之前还没free掉,总有一个时间点会出现尽管总内存够但无法再申请足够使用的情况
所以可变数组不够高效 解决办法:
linked blocks,no copy
就只申请block那么大的内存,与原来的内存空间链起来 理想中的效果:
|-------------|
| 内存1 |---+
|-------------| |
+--------------------+
| |-------------|
+->| block |---+
|-------------| |
+--------------------+
| |-------------|
+->| block |
|-------------| 实际中:
head
|
|-------------| |--------------| |-------------|
| 数据 | point |--->| 数据 | point |--->| 数据 | point |
|-------------| |--------------| |---------|---|
-
整个结构叫做链表,其中带有数据的叫做结点 让last一开始等于第一个的数据,看next有没有东西,让last所指那个东西的下一个,于是last指向了第二个的数据
*/ Node *head = NULL;
int number;
do {
scanf("%d\n", &number);
if ( number != - ) {
// add to linked-list
Node *p = (Node*)malloc(sizeof(Node)); // 为结构分配一块内存空间
p->value = number; // 初始化值为number
p->next = NULL; // 初始化第一个的next为null,即下一个为null
// find the last
Node *last = head; // 初始化:最后一个就是当前的这个
if ( last ) { // 如果last不为null了
while ( last->next ) { // 如果最后一个还有next的话,last就是last的next
last = last->next; // 当循环停止时,last所指的就是最后一个
}
// attach
last->next = p;
} else {
head = p; // 只有第一个,head为p
}
}
} while ( number != - ); return ;
}

 改进:

//  main.c

#include "node.h"
#include <stdio.h>
#include <stdlib.h> // 单独定义一个数据类型表示list
typedef struct _list {
Node* head;
} List; void add(List* list, int number); int main(int argc, const char * argv[]) { List list;
int number;
list.head = NULL; do {
scanf("%d\n", &number); if (number != -) {
       add(&list, number);
}
} while(number != -); return ;
} // 添加函数独立出来
void add(List* pList, int number)
{
Node *p = (Node*)malloc(sizeof(Node)); p->value = number;
p->next = NULL; Node *last = pList->head;
if (last) {
while (last->next) {
last = last->next;
}
last->next = p;
} else {
pList->head = p;
}
}

搜索

删除

清除

Link:http://www.cnblogs.com/farwish/p/4628952.html

[C语言]进阶|链表的更多相关文章

  1. C语言之链表

    这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...

  2. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

  3. 【R笔记】R语言进阶之4:数据整形(reshape)

    R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...

  4. YTU 2430: C语言习题 链表建立,插入,删除,输出

    2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 576  解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...

  5. 《C语言进阶剖析》课程目录

    <C语言进阶剖析>学习笔记                                                         本文总结自狄泰软件学院唐佐林老师的<C语言 ...

  6. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  7. Go语言核心36讲(Go语言进阶技术二)--学习笔记

    08 | container包中的那些容器 我们在上次讨论了数组和切片,当我们提到数组的时候,往往会想起链表.那么 Go 语言的链表是什么样的呢? Go 语言的链表实现在标准库的container/l ...

  8. 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01

    书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...

  9. c语言进阶14-线性表之链表

    一.  线性表的链式存储结构 1.        顺序存储结构不足的解决办法 前面我们讲的线性表的顺序存储结构.它是有缺点的,最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间.能不能想 ...

随机推荐

  1. 自动化测试-7.selenium定位一组对象

    前言 前面的几篇都是讲如何定位一个元素,有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象. webdriver 提供了定位一组元素的方法,跟前面八种定位方式 ...

  2. NAS (Network Attached Storage)

    当电脑硬盘容量满了,多数使用者第一个想法就是买一块几TB的硬盘来扩充,如果是笔电的使用者,第一个想到的是买一个外接式硬盘来备份资料,这样的想法并没有错,那是当你还不知道有「NAS」这个好用的东西,才会 ...

  3. [转]C++11 左值、右值、右值引用详解

    https://blog.csdn.net/hyman_yx/article/details/52044632 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡 ...

  4. linux 创建sudo账号.md

    内容来源自网络 方案一 root登录 ssh root@server_ip_address 新增用户 adduser username 设置密码 passwd username 输入两次密码 修改帐户 ...

  5. 让你简洁清晰真正的了解什么是JavaSCript

    学习JavaScript高级程序设计第三版第一步.JavaScript简介不光在这一本说介绍,很多书都提及到,我就简单的把重点记录下来,当做整理吧,以便自己及大家观看. 1995年,我出生了,Java ...

  6. Linux上的文件管理类命令(2)

    Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示: wc 统计文件中的字节数.单词数.行数.并将统计结果显示输出 -c, --bytes 打印字节数 [root@qingchen ...

  7. pom.xml中添加远程仓库

    maven的pom.xml中添加远程仓库 <repositories> <repository> <id>mvnrepository</id> < ...

  8. struts2 自定义异常拦截器配log4j

    log4j.rootLogger = debug,stdout,F log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.app ...

  9. windows openssh server 安装试用

    使用Windows的可能会知道win10 的已经包好了openssh 服务,但是对于其他机器win 7 windows 2008 ,就需要其他的方法了 还好powershell 团队开发了支持wind ...

  10. shiro(安全框架)

    shiro.apache.org JavaSE环境搭建Shiro框架 1/导入与 shiro相关的Jar包 所有集好的环境可以在如下目录查找 复制如上文件到工程中 2/配置文件:储存临时文件 shir ...