当前位置: 代码迷 >> C语言 >> C中如何实现泛化数组
  详细解决方案

C中如何实现泛化数组

热度:173   发布时间:2007-09-10 17:03:07.0
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++了


----------------解决方案--------------------------------------------------------
  相关解决方案