我正在尝试用 C 实现 vector 或数组列表。该代码没有 main,因此我使用 gcc -c file.c 对其进行编译。我有两个问题,第一个问题是如何为 arraylist 实现插入函数,第二个问题是为什么我收到 list-> is not a function 的错误。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
typedef struct ArrayList {
int *data;
int capacity;
int size;
ArrayList *list;
ArrayList ArrayList_init(int);
int insert(ArrayList *, int , int);
int set(ArrayList*, int, int);
int destroy(ArrayList *);
int print(ArrayList *);
int append(ArrayList *, int);
int valueOf( ArrayList *, int);
int size(ArrayList *);
int capacity(ArrayList *);
} ArrayList;
ArrayList * ArrayList_Init( int n )
{
ArrayList->data = malloc(sizeof(n) * ArrayList->capacity);
}
int append( ArrayList * list, int val )
{
if (list->size >= list->capacity)
return 1;
else
Arraylist->data[list->size++] = value;
return 0;
}
int print( ArrayList * list )
{
printf("%d\n", list->data);
return 0;
}
int set( ArrayList * list, int val, int index )
{
while(index >= list->size)
append(ArrayList, 0);
return 0;
if (index < 0 || index >= size)
return 1;
}
int destroy( ArrayList * list )
{
free(list->data);
return 0;
}
int insert(ArrayList * list, int val, int index)
{
return 0;
}
int valueOf( ArrayList * list, int element )
{
int x;
x = list->data[element];
return x;
}
int size(ArrayList * list)
{
return list->size;
}
int capacity(ArrayList * list)
{
return list->capacity;
}
int main(void)
{
int n = 3;
int i;
int stat; // Error code
int size;
int val = 0;
int capacity;
// allocate list
ArrayList *list = NULL;
list = ArrayList_Init(n);
printf("ArrayList initialized to %d elements\n", n);
printf("Size of List = %d\n", list->size(list));
printf("Capacity of List = %d\n", list->capacity(list));
// Fill initial values
list->set(list, val++, 0);
list->set(list, val++, 1);
list->set(list, val++, 2);
}
谢谢
最佳答案
首先,如果您声明一个返回某些内容的函数,那么它必须这样做。 我认为你的 ArrayList_Init 应该更像这样(我假设你想存储整数)
ArrayList * ArrayList_Init( int n )
{
ArrayList * list = malloc(ArrayList);
list->data = malloc(sizeof(int) * n);
list->capacity = n;
list->size=0;
return list;
}
在追加以及 Init 中,您尝试访问类型。
Arraylist->data[list->size++] = value;
但应该是
list->data[list->size++] = value;
对于插入内容,您可以执行类似于以下操作的操作:
int insert( ArrayList * list, int val ,int position)
{
if (list->size >= list->capacity){
int * temp = malloc(sizeof(int) * list->capacity *2);
int i;
for(i=0;i<position-1;i++){
temp[i]=list->data[i];
}
for(i=postion-1;i<list->size;i++){
temp[i+1]=list->data[i];
}
free(list->data);
list->data=temp;
list->capacity *=2;
}else{
for(i=list->size;i>postion-1;i--){
list->data[i]=list->data[i-1];
}
}
list->data[position-1]=val;
list->size++;
return 1;
}
您可能想要在附加中执行类似的操作,因为否则您只有一个静态数组。 vector 的思想是它自动增长和收缩。
编辑: 在 C 中,你不能只在结构体中声明函数的原型(prototype)然后访问它。 您可以执行与您想要执行的操作类似的操作的唯一方法是在结构中存储指向每个函数的指针。看看下面的帖子。 Define functions in structs
关于c - C 中的 vector/数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19920338/