2013-11-12 3 views
0

Я пытаюсь реализовать вектор или arraylist в C. Код не имеет основного, поэтому я компилирую его с помощью gcc -c file.c. У меня есть два вопроса, первый из которых заключается в том, как реализовать функцию вставки для arraylist, а вторая - почему я получаю сообщение об ошибке, которое list-> не является функцией.vector/arraylist in C

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

Спасибо

+0

Почему ваши прототипы функций внутри блока 'typedef struct ArrayList'? Дает ли вам номер строки для этой ошибки? – Leigh

+0

все экземпляры списка-> считались проблематичными в тот момент, когда я добавил простую основную функцию, поэтому я думаю, что проблема кроется в этом коде. –

+0

Вы можете показать нам свою функцию 'main()', а также как сообщение об ошибке из gcc? – dpp

ответ

1

Прежде всего, если вы объявляете функцию, которая возвращает что-то он должен сделать это. Я думаю, что ваш 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; 
} 

В Append, а также в 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; 
    } 

Вы, вероятно, хотите сделать что-то подобное в Append, потому что в противном случае у вас просто есть статический массив. Идея вектора заключается в том, что он растет и сжимается автоматически.

Редактировать: В C вы не можете просто объявить прототип функции внутри структуры и получить доступ к ней. Единственный способ сделать что-то похожее на то, что вы хотите сделать, - это сохранить указатель на каждую из функций внутри вашей структуры. Взгляните на следующую публикацию. Define functions in structs

+0

Что такое неизвестное имя типа и 'has ни один член с именем 'print' 'или' set 'или' insert ', который я продолжаю получать для ArrayList? –

+0

А, ладно. Большое спасибо, что исправлено большинство из них. –