5.1可变数组

5.2链表

5.1可变数组

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 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);

头文件array.h

 #include <stdio.h>

 #ifndef _ARRAY_H_
#define _ARRAY_H_ typedef struct
{
int *array;
int size;
}Array; Array array_create(int init_size);//清空数组
void array_free(Array *a);//返回数组元素数量
int array_size(const Array *a);//返回数组某个下标的值
int *array_at(Array *a, int index);//返回数组某个下标的值
int array_get(const Array *a, int index);//返回数组某个下标的值
void array_set(Array *a, int index, int value);//修改数组某个下标的值
void array_inflate(Array *a, int more_size);//增大数组 #endif

源文件array.c

 #include "array.h"

 const BLOCK_SIZE = ;

 //typedef struct
//{
// int *array;
// int size;
//}Array; 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)
{
array_inflate(a, (index / BLOCK_SIZE + )*BLOCK_SIZE - a->size);
}
return &(a->array[index]);
} int array_get(const Array *a, int index)//返回数组某个下标的值
{
return a->array[index];
} void array_set(Array *a, int index, int value)//修改数组某个下标的值
{
a->array[index] = value;
} 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; i++)
{
p[i] = a->array[i];
}
free(a->array);
a->size += more_size;
} void main()
{
Array a = array_create();
printf("%d\n", array_size(&a));
*array_at(&a, ) = ;
printf("%d\n", *array_at(&a, )); int number;
int cnt = ;
while ()
{
/*scanf("%d", &number);
*array_at(&a, cnt++) = number;*/
scanf("%d", array_at(&a, cnt++));
} array_free(&a); system("pause");
}

5.2链表

issues

Allocate new memory each time it inflates is an easy and clean way. BUT

It takes time to copy, and

may fail in memory restricted situation

必须保证:->箭头左边的指针,不能为空

     for (q = , p = head; p; q = p, p = p->next)
{
if (p->value == )
{
q->next = p->next;
}
}

必须保证:->箭头左边的指针,不能为空

网易云课堂_C语言程序设计进阶_第5周:链表的更多相关文章

  1. 网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合

    3.1 枚举 3.2 结构 3.3 类型定义 3.1 枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法来表明: enum 枚举类型名字{名字0,...,名字n}; 枚举类型名字通常并不 ...

  2. 网易云课堂_C语言程序设计进阶_第6周:程序结构

    6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...

  3. 网易云课堂_C语言程序设计进阶_第8周:图形交互程序

    8.2函数指针 8.2函数指针 #include <stdio.h> #include <stdlib.h> void f(int i) { printf("void ...

  4. 网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出

    7.1文件 7.2底层操作 7.1文件 格式化的输入输出 printf %[flags][width][.prec][hIL]type Flag 含义 - 左对齐 + 在前面放+或- (space) ...

  5. 网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列

    1 逆序输出的数列(10分) 题目内容: 你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束.然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1. 输 ...

  6. 网易云课堂_C语言程序设计进阶_期末考试编程题部分

    1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未 ...

  7. 网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告

    2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一 ...

  8. 网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型_1计算分数精确值

    1 计算分数精确值(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商, ...

  9. 网易云课堂_C语言程序设计进阶_第四周:ACL图形库

    创建ACLLib程序 #include"acllib.h" #include<stdio.h> int Setup1() { initWindow(, );//初始化窗 ...

随机推荐

  1. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

  2. struts2笔记09-动态方法调用

    1.action配置 <action name="testDynamic" class="com.test.actions.TestAction"> ...

  3. hdu 5126 stars cdq分治套cdq分治+树状数组

    题目链接 给n个操作, 第一种是在x, y, z这个点+1. 第二种询问(x1, y1, z1). (x2, y2, z2)之间的总值. 用一次cdq分治可以将三维变两维, 两次的话就变成一维了, 然 ...

  4. python排序(选择, 插入)

    1.选择排序 算法: 对于一组关键字{K1,K2,…,Kn}, 首先从K1,K2,…,Kn中选择最小值,假如它是 Kz,则将Kz与 K1对换:然后从K2,K3,… ,Kn中选择最小值 Kz,再将Kz与 ...

  5. 怎查看linux系统的位数

    # uname -a x86_64则说明你是64位内核, 跑的是64位的系统. i386, i686说明你是32位的内核, 跑的是32位的系统

  6. 【JavaScript脚本编程技术详解-----(一)】

    首先说明,本系列教程是写给有一定的JavaScript编程基础的同学看的,最好还有其它的编程语言经验,因为里面可能涉及一些其它的程序设计语言写的源代码,这都是我自己总结的经验,我喜欢在学习一门新的编程 ...

  7. java中文乱码解决之道(四)—–java编码转换过程

    原文出处:http://cmsblogs.com/?p=1475 前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的. ...

  8. Thrift使用实例

    首先下载thrift.exe,和对应lib包.注意版本一定要一致. 否则编译会不识别出现错误. 可能会出现org.slf4j这个错误,那么你要把slf4j-api.jar下载下来引入到你的projec ...

  9. utf8+bom格式保存php curl乱码问题

    今天开发遇到一个php curl取数据乱码问题 不是gzip也不是编码设置问题 最后有一同事判断为utf8+bom保存数据原因,懒得深入了解utf8+bom,仅做记录 [root@centos5 ~] ...

  10. Vim配置 终端背景色配置

    在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进 等功能的.为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc.在启动vim时,当前用户 ...