作业 - 动态数组

main.m

 1 #import <Foundation/Foundation.h>
 2 #include "Array.h"
 3 #include "Object.h"
 4 #include "Student.h"
 5
 6 int main(int argc, const char * argv[]) {
 7     @autoreleasepool {
 8
 9         Array *arr = ArrayCreate();
10         Anypointer student;
11
12         student = (Object*)StudentNew("小明", 20);
13         ArrayAdd(arr, student);
14         OBJECT_RELEASE(student);
15
16         student = (Object*)StudentNew("大明", 21);
17         ArrayAdd(arr, student);
18         OBJECT_RELEASE(student);
19
20         student = (Object*)StudentNew("小李", 22);
21         ArrayAdd(arr, student);
22         OBJECT_RELEASE(student);
23
24         student = (Object*)StudentNew("小张", 24);
25         ArrayAdd(arr, student);
26         OBJECT_RELEASE(student);
27
28         student = (Object*)StudentNew("小马", 28);
29         ArrayAdd(arr, student);
30         OBJECT_RELEASE(student);
31
32         student = (Object*)StudentNew("小陈", 29);
33         ArrayAdd(arr, student);
34         OBJECT_RELEASE(student);
35
36         student = (Object*)StudentNew("小蔡", 25);
37         ArrayAdd(arr, student);
38         OBJECT_RELEASE(student);
39
40         student = (Object*)StudentNew("小王", 26);
41         ArrayAdd(arr, student);
42         OBJECT_RELEASE(student);
43
44         printlist(arr);
45
46         printf("删除小李\n");
47
48         ArrayRemoveAt(arr, 2);
49
50         printlist(arr);
51
52         printf("加入老王\n");
53         student = (Object*)StudentNew("老王", 50);
54         ArrayInsertAt(arr, student, 6);
55
56         printlist(arr);
57
58         ArrayDestory(arr);
59     }
60     return 0;
61 }

Array.h

 1 #ifndef Array_h
 2 #define Array_h
 3
 4 #include "Object.h"
 5 #include <stdio.h>
 6
 7 typedef Object* Anypointer;
 8
 9 typedef struct Array_ {
10            int retainCount_;
11            int length_;        //实际长度
12            int capacity_;      //分配的内存长度
13     Anypointer *students_;     //数组类型
14 }Array;
15
16 Array *ArrayCreate();          //创建数组
17
18 int ArrayGetLength(Array *arr); //获取长度
19
20 void ArrayAdd(Array *arr, Anypointer student); //添加元素
21
22 void ArrayInsertAt(Array* arr, Anypointer student, int index);//插入元素
23
24 void ArrayRemoveAt(Array *arr, int index);//删除元素
25
26 Anypointer ArrayGetAt(Array *arr, int index);//获取指定元素
27
28 void printlist(Array *arr);//打印数组
29
30 void ArrayDestory(Array *arr); //数组销毁
31
32 #endif /* Array_h */

Array.c

 1 #include "Array.h"
 2 #include "Object.h"
 3 #include "Student.h"
 4 #include <stdlib.h>
 5 #include <string.h>
 6 #include <assert.h>
 7
 8
 9 static Anypointer *allocMemoryByCapacity(Array *arr){
10     return malloc(sizeof(Anypointer) * arr->capacity_);
11 }
12
13 Array *ArrayCreate(){                                   //创建数组
14     Array *arr       = malloc(sizeof(Array));
15     arr -> length_   = 0;
16     arr -> capacity_ = 10;
17     arr -> students_ = allocMemoryByCapacity(arr);
18     return arr;
19 }
20
21 int ArrayGetLength(Array *arr){                         //获取实际长度
22     return arr->length_;
23 }
24
25 void ArrayAdd(Array *arr, Anypointer student){          //添加元素
26     if (arr->length_ >= arr->capacity_) {
27         arr->capacity_ *= 2;
28         Anypointer *oldValue = arr->students_;
29         arr->students_ = allocMemoryByCapacity(arr);
30         memcpy(arr->students_, oldValue, arr->length_);
31         free(oldValue);
32     }
33     arr->students_[arr->length_] = student;
34     OBJECT_RETAIN(student);
35     arr->length_ ++;
36 }
37
38 void ArrayInsertAt(Array* arr, Anypointer student, int index){ //插入元素
39     ArrayAdd(arr, student);
40     for (int i = arr->length_ - 1; i >= index; i --) {
41         arr->students_[i] = arr->students_[i-1];
42     }
43     arr->students_[index - 1] = student;
44     OBJECT_RETAIN(student);
45 }
46
47 void ArrayRemoveAt(Array *arr, int index){      //删除元素
48     assert(index >= 0 && index < arr->length_);
49     OBJECT_RELEASE(ArrayGetAt(arr, index));
50     arr->length_ --;
51     for (int i = index; i < arr->length_; i++) {
52         arr->students_[i] = arr->students_[i+1];
53     }
54 }
55
56 Anypointer ArrayGetAt(Array *arr, int index){   //获取元素
57     assert(index >= 0 && index <= arr->length_);
58     return arr->students_[index];
59 }
60
61 void printlist(Array *arr){                     //打印数组
62     for (int i = 0; i < arr->length_; i++) {
63         printf("位置:%2d ", i+1);
64         printf("名字:%s ", StudentGetName((Student*)arr->students_[i]));
65         printf("年龄:%d \n", StudentGetAge((Student*)arr->students_[i]));
66     }
67 }
68
69 void ArrayDestory(Array *arr){ //数组销毁
70     free(arr->students_);
71     free(arr);
72     printf("arr released.\n");
73 }

Object.h

 1 #ifndef Object_h
 2 #define Object_h
 3 #include <stdio.h>
 4
 5 //引用计数法 管理内存
 6
 7 typedef struct Object_{
 8            int retainCount_;
 9 }Object;
10
11 #define OBJECT_RETAIN(obj)       ObjectRetain((Object*)obj)
12 #define OBJECT_RELEASE(obj)      ObjectRelease((Object*)obj)
13 #define OBJECT_RETAIN_COUNT(obj) ObjectRetainCount((Object*)obj)
14
15 void ObjectRetain(Object *obj);
16
17 void ObjectRelease(Object *obj);
18
19 int  ObjectRetainCount(Object *obj);
20
21 #endif /* Object_h */

Object.c

 1 #include "Object.h"
 2 #include <stdlib.h>
 3
 4 void ObjectRetain(Object *obj){         //引用计数++
 5      obj->retainCount_ ++;
 6 }
 7
 8 void ObjectRelease(Object *obj){        //引用计数--
 9     obj->retainCount_ --;
10     if (obj->retainCount_ <= 0) {
11         free(obj);
12         printf("Released the obj.\n");
13     }
14 }
15
16 int ObjectRetainCount(Object *obj){     //获取引用计数
17     return obj->retainCount_;
18 }

Student.h

 1 #ifndef Student_h
 2 #define Student_h
 3
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 #include "Object.h"
 7
 8 typedef struct Student_{        //创建 Student 结构体
 9            int retainCount_;
10           char *name_;
11            int age_;
12 }Student;
13
14 Student *StudentNew(char *name, int age);  //新建 Student
15
16    char *StudentGetName(Student* student); //获取姓名
17
18     int StudentGetAge(Student* student);   //获取年龄
19
20 #endif /* Student_h */

Student.c

 1 #include "Student.h"
 2
 3 Student* StudentNew(char *name, int age){       //新建 Student
 4     Student *student = malloc(sizeof(Student));
 5     OBJECT_RETAIN(student);
 6     student->name_   = name;
 7     student->age_    = age;
 8     return student;
 9 }
10
11 char* StudentGetName(Student* student){         //获取姓名
12     return student->name_;
13 }
14
15 int StudentGetAge(Student* student){            //获取年龄
16     return student->age_;
17 }
时间: 2024-10-17 22:24:57

作业 - 动态数组的相关文章

vc++基础班[28]---动态数组及动态链表的讲解

C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray.CList.CMap 会更方便一些! CArray.CList.CMap 的由来?…… ①.数组的基本说明: 数组是固定大小的,相同数据类型的元素的顺序集合,每个元素在数组中有一个固定的位置. 将10个数放入数组中,假设数组的名称为number,可以称数组中第一个元素为 number[0],第二个

C++ Primer 笔记——动态数组

1.动态数组定义时也需要指明数组的大小,但是可以不是常量. int i; int arr[i]; // 错误,数组的大小必须为常量 int *p = new int[i]; // 正确,大小不必是常量 2.虽然我们通常称 new T[ ] 分配的内存为动态数组,但我们并未得到一个数组类型的对象,而是得到一个数组元素类型的指针.所以不能对动态数组调用begin或end,也不能用for语句来处理动态数组中的元素. 3.默认情况下,new分配的对象,不管是单个分配的还是数组中的,都是默认初始化的.我们

通用型动态数组的总结

基本数据结构之-通用型动态数组 动态数组的应用主要是对于长度未知的数组,先开辟一段空间来存储数据,当空间不够时,在开辟两倍的空间来存储数据 和普通数组的区别就是,我们可以不用关心数组的长度的问题,唯一需要关注的就是数据的类型是自定义数据类型还是基本数据类型,但是不论是基本数据类型还是自定义的数据类型,都需要自定义两个函数,这两个函数时遍历(打印)函数和比较函数,因为,在传递的是地址,没法再里面判断是什么类型,只能交给使用者去定义它的想关的函数, 先说基本的结构: 为了适应更多的数据类型,我们存储

动态数组

动态数组也叫数组的动态联编,有动态联编自然也有静态联编,静态联编就是数组的长度在编译时设置,而动态联编是在运行时才为数组分配空间,其长度在运行时设置,使用完这种动态数组后,应该释放内存. 静态联编:int arr[10];       //数组长度为一常量 动态数组在ISO C99后就有了新的规定(如下图文件): 这是部分说明,完整的说明在 ISO/IEC9899 标准的 6.7.5.2 Array declarators里可以看到,这个里面加入了可变长数组的相关规定. #include <io

delphi 动态数组的使用

var RowArray: array of string; i: integer; begin SetLength(ArrayRow, G2.ColumnCount-1); // 动态数组初始化 先定义长度 for i := 0 to G2.ColumnCount-1 do begin ArrayRow[i] := G2.Cells[i, G2.Selected]; // 将点击的行存入数组内,若比较不相等时,则post提交保存数据. end; end;

C# 动态数组(ArrayList)

动态数组(ArrayList)代表可单独被索引的对象的集合. 动态数组可以自动调整大小. 允许动态内存的分配,怎加,搜索,排序. using System; using System.Collections; namespace CollectionApplication { class Program { static void Main(string[] args) { ArrayList al = new ArrayList(); Console.WriteLine("Adding som

动态数组使用

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() 5 { 6 int i; 7 int n; //用于记录输入的整数的个数 8 int *p; //用于指向动态数组的存储空间 9 int sum=0,average; //用于记录输入的整数的和与平均值 10 11 scanf("%d",&n);//输入要输入的整数的个数 n 12 13 p=calloc(n,sizeof(int)); //动

[转]delphi 删除动态数组的指定元素

type TArr = array of TPoint; {把数组先定义成一个类型会方便许多, 这里仅用 TPoint 测试} {删除动态数组指定元素的过程: 参数 arr 是数组名, 参数 Index 是要删除的索引} procedure DeleteArrItem(var arr: TArr; Index: Integer); var Count: Cardinal; begin Count := Length(arr); if (Count = 0) or (Index < 0) or (

nginx学习七 高级数据结构之动态数组ngx_array_t

1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存.但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息,并且可以动态增长.下面 我们从数组的定义上来详细的了解一下.ngx_array_t的定义位于src/core/ngx_array.c|h里面. struct ngx_array_s { void *elts;//数组的首地址 ngx_