C中如何实现泛化数组
就是想建立一个数组,逐个的存入一些数字,但是不知道到底存入多少个!那存入后如何访问什么的。。
谢谢,请高手指点
搜索更多相关的解决方案:
泛化
----------------解决方案--------------------------------------------------------
a[]?
----------------解决方案--------------------------------------------------------
你建立的一个数组,你一定要给出数组的大小,这是确定的,要不然,编译通不过.
当你知道了数组的大小,就可以控制最多可以存放数字的多少.
然后,对数组进行初始化工作.例如,要存放的是字符数据,由于字符数据的值>=0.
你就可以将数组的所有元素都初始化为-1.
存放的时侯,先判断有没有超出数组范围,然后再判断相对应下标的元素是不是为-1,
如果为-1,表示可以存放,否则,不可以.
访问的时侯,也就是判断有没有超出范围,再判断元素是否为-1.
----------------解决方案--------------------------------------------------------
我想楼主遇到的题目是先输入一个数n,在存入n个数吧,在读出这么多个数,如果是这样的话。。。
可以定义一个大一点的数组如a[200],我想一般题目要输入的数n都不大吧,然后就可以
for(int i=0;i<n;i++)
scanf("%d",&a[i]); // 如果输入的是整数的话
读出就可以是: for(int j=0;j<n;j++)
printf("%d ",a[j]);
貌似这个也可以用链表来做,这样就可以动态分配了,但输入的数n还是不能太大吧,毕竟内存有限的阿。。。
----------------解决方案--------------------------------------------------------
用链表做了就不是数组了。
我首先想到的是C++中的vector,以前见过有人用C写面向对象风格的代码,记得不是很清楚,根据自己的理解我写了下面的一种实现方法:
[CODE]
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
//=============================Starting to define my Array class=========================
//-----------------------------Declaration segment-------------------------
typedef int DataType;
typedef struct array{
DataType *Data;
int size,max_size;
void (*Input)(DataType , struct array *);
void (*Constructor)(struct array *);
void (*Destructor)(struct array *);
}Array;
void Init(Array *this);
void _constructor(Array *this);
void _denstructor(Array *this);
void _input(DataType data, Array *this);
//------------------------------Implemen segment---------------------------
void _input(DataType data, Array *this)
{
int i;
DataType *ptr;
if(this->size >= this->max_size)
{
this->max_size +=10;
ptr=(DataType *)malloc(this->max_size*sizeof(DataType));
for(i=0;i<this->size;i++)
ptr[i]=this->Data[i];
free(this->Data);
this->Data=ptr;
}
this->Data[this->size]=data;
++(this->size);
}
void _constructor(Array *this)
{
this->size=0;
this->max_size=10;
this->Data=(DataType *)malloc(this->max_size*sizeof(DataType));
}
void _denstructor(Array *this)
{
free(this->Data);
}
void Init(Array *this)
{
this->Input =_input;
this->Constructor =_constructor;
this->Destructor =_denstructor;
this->Constructor(this);
}
//===================================definition end===============================
// 使用示例
int main()
{
Array MyArray;
Init(&MyArray); //使用对象前必须初始化,间接调用构造函数
MyArray.Input(1,&MyArray);
MyArray.Input(2,&MyArray);
printf("The elements of MyArray : %d,\t%d",MyArray.Data[0],MyArray.Data[1]);
getch();
MyArray.Destructor(&MyArray); //使用对象后必须显式调用析构函数
return 0;
}
[/CODE]
可惜C不支持template,不能做成模板;函数不能隐式传递this指针,不得不显示加入this;不支持运算符重载,不能使用[]直接访问元素;否则可以写出更加优雅的代码。
如果大家可以用C写出更加OO的code欢迎跟贴讨论。
----------------解决方案--------------------------------------------------------
[CODE]#include <stdio.h>
#include <stdlib.h>
int main()
{
int *PData;
int PDataCount=0;
PData = (int*) malloc( sizeof(int) );
while(1)
{
scanf("%d",&PData[PDataCount]);
for(int i=0;i<=PDataCount;i++)
{
printf(" %d ",PData[i]);
}
printf("\n\n");
PDataCount++;
PData = (int*) realloc( PData,sizeof(int)*(PDataCount+1) );
}
return 0;
}[/CODE]
----------------解决方案--------------------------------------------------------
用动态数组啊
----------------解决方案--------------------------------------------------------
谢谢哦
----------------解决方案--------------------------------------------------------
我也知道可以用简单的动态分配内存,不过用一个对象来维护动态数组更方便吧,C++ 中的vector就是个好例子。
希望有人讨论下C中面向对象的实现技巧。
----------------解决方案--------------------------------------------------------
C就是C,C++就是C++
如果C用你在5楼的方式来实现,它就不是C了;如果C++用我在6楼的方式实现,它也不是C++了
----------------解决方案--------------------------------------------------------