2011-01-15 8 views
3

C에서 약간의 프로그램을 만들고 있는데 Vector/ArrayList/LinkedList를 필요로하지만 C와 함께 작업하고 있습니다. 그런 종류의 작업을 수행 할 수있는 방법에 대한 아이디어 C?C Vector/ArrayList/LinkedList

구조체를 저장 한 다음 일부를 추가/제거하고 싶습니다.

+4

표준 C 라이브러리에는 그런 것이 없습니다. 사람들은 대개 자신의 역할을합니다. – Thomas

+3

벡터 및 ArrayList라는 용어는 일반적으로 동일한 데이터 구조 (크기 조정 가능한 배열)를 참조하지만 링크 된 목록은 완전히 다른 것입니다. 그래서 크기를 조정할 수있는 배열이나 링크 된 목록을 원하십니까? – sepp2k

+2

그리고 사람들은해서는 안됩니다. Glib은 http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html에서 매우 훌륭한 구현을 가지고 있습니다. 그리고 대부분의 유닉스 C 라이브러리에는 tsearch의 구현이 포함되어 있습니다. , 요소 목록으로 서비스 될 수 있습니다. –

답변

3

크기 조정 가능한 배열의 경우 malloc()realloc()을 사용할 수 있습니다. 이를 통해 힙에 특정 공간을 예약 (malloc())하고 크기를 조정할 수 있습니다 (realloc()). 그들은이 방법을 사용하고 있습니다 :

int* a = malloc(10 * sizeof(int)); 

if(a == NULL) {}  // malloc() was unable to allocate the memory, handle the 
        // error and DO NOT use this pointer anymore 

// now you can treat a as a normal array of 10 ints: 
a[4] = 51; 

// suppose 10 ints aren't no more enough: 
a = realloc(a, 20 * sizeof(int)); 

if(a == NULL) {}  // same thing as before 

// here you have 20 ints, the previous 10 are still there 
a[18] = a[4] 

// don't forget to free the memory when you have finished: 
free(a); 

은 그냥 구조체 유형 'INT'을 대체합니다. ;)

+0

질문에 "C"태그 만 붙어 있기 때문에 오류보다 더 해를 끼치는 불필요한 (예를 들어 추악한!) 캐스트를 예제에 채워야하는지 여부는 의심 스럽습니다. 'void *'로의 캐스팅은 논란의 여지도 있지만 절대로 좋은 연습은 아닙니다! 또한 예외 처리가 중요하기 때문에 오류 처리가 중요하므로'malloc'과'realloc'의 반환 값을 확인해야합니다 (원래 포인터를 잃지 말아야합니다!) 또한'realloc '을 호출해도 거의 모든 컴퓨터의 버퍼 크기 (20 바이트는 ** 매우 ** 거의 10 개 이상의 int)입니다. –

+0

또한이 유형을 다른 유형과 함께 사용하려면 캐스트 이상을 변경해야합니다. 그러나 더 나은 스타일 (예 :'type * ptr = malloc (N * sizeof * ptr)'및'realloc'과 유사하게)을 따르면 선언에서'type' 유형을 변경해야합니다. –

+0

무료() – BatchyX

1

C는 C++ 및 Java와 같은 높은 수준의 언어와는 달리 표준 수집의 어떤 형태 (제공되지 않음) 그래서 당신은 몇 가지 옵션으로 남겨 :

  1. 를 사용하여 만든 기존의 일부 그룹에 의해/
  2. (위에서 언급 한 바와 같이) 어떤 개인이 만들고 자신의

당신은 정확하게 당신이 사용하는 어떤 결정하기 위해이 프로그램에 필요한 고려해야합니다. 당신이 원하는 것은 아마도 두 가지 옵션 중 하나를 찾고있을 것입니다 :

  1. 할당하면 동적으로 커질 어레이입니다. 본질적으로, 그 시점에서 배열 내에 얼마나 많은 요소가 포함되어 있는지를 관리해야합니다. 삽입하는 동안 언제든지 최대 요소 수를 초과하는 경우 새 배열을 만들고 요소를 새 배열에 복사 한 다음 새 요소를 삽입하고 마지막으로 배열을 삭제해야합니다. 이것은 액세스 시간면에서 (색인 가능하기 때문에) 더 빠르지 만, 너무 많이 할당하면 느려지고 메모리를 많이 소비합니다. 예를 보려면 BlackBear의 코드를 참조하십시오.
  2. 디자인에 따라 동적으로 커지는 연결 목록입니다. 여기를 참조하십시오 : http://en.wikipedia.org/wiki/Linked_list#Singly-.2C_doubly-.2C_and_multiply-linked_lists. 이것은 특별한 경우에 별도의 유지 보수가 필요 없다는 주된 이점이 있지만 느린 액세스의 단점이 있습니다 (원하는 요소를 찾을 때까지 각 요소를 살펴보십시오).

두 가지 종류의 데이터 구조 간의 절충에 대한 자세한 내용은 Wikipedia 페이지를 참조하십시오.

+0

다칠 때마다 다시 할당합니까? – SBSTP

+0

@ user576488 : 속도가 매우 느립니다. 나중에 필요할 경우를 대비해 일부 공간을 사용하지 않고 배열을 선언 할 수 있습니다. – BlackBear

+0

재 할당하면 청크를 10으로 말할 수 있습니까? 더 낫겠 니? – SBSTP

5

기존 구현을 사용하십시오. 수십억 달러가 있습니다. Glib은 아마도 시작하기에 좋은 곳일 수도 있고 LibH 일 수도 있습니다.

2

@Conrad Meyer의 답변을 사용했습니다. 최신 Glib 라이브러리를 here에서 다운로드하여 this 매뉴얼을 사용하여 편집합니다. Glib 라이브러리를 테스트하기 위해서 나는 this 테스트를 사용했다. 테스트 코드를 컴파일하는 동안 오류가 발생할 수 있습니다. This을 사용하면 문제를 해결하는 데 도움이됩니다.

또한 테스트 코드에 어떤 종류의 메모리 누수가 있음을 발견했습니다.Valgrind의 결과는 원래의 코드를 실행 :

#include <stdio.h> 
#include <glib.h> 

int main(int argc, char** argv) { 
    GList* list = NULL; 
    list = g_list_append(list, "Hello world!"); 
    printf("The first item is '%s'\n", (char *)g_list_first(list)->data); 
    g_list_free(list); 
    return 0; 
} 

Valgrind의 새로운 결과 :

==20350== HEAP SUMMARY: 
==20350==  in use at exit: 4,632 bytes in 12 blocks 
==20350== total heap usage: 12 allocs, 0 frees, 4,632 bytes allocated 
==20350== 
==20350== LEAK SUMMARY: 
==20350== definitely lost: 0 bytes in 0 blocks 
==20350== indirectly lost: 0 bytes in 0 blocks 
==20350==  possibly lost: 992 bytes in 4 blocks 
==20350== still reachable: 3,640 bytes in 8 blocks 
==20350==   suppressed: 0 bytes in 0 blocks 

그래서 나는 코드 한 줄을 삽입

==20310== HEAP SUMMARY: 
==20310==  in use at exit: 4,632 bytes in 12 blocks 
==20310== total heap usage: 12 allocs, 0 frees, 4,632 bytes allocated 
==20310== 
==20310== LEAK SUMMARY: 
==20310== definitely lost: 0 bytes in 0 blocks 
==20310== indirectly lost: 0 bytes in 0 blocks 
==20310==  possibly lost: 0 bytes in 0 blocks 
==20310== still reachable: 4,632 bytes in 12 blocks 
==20310==   suppressed: 0 bytes in 0 blocks 

This 대답은 이야기가있다 still reachable 메모리에 대해 걱정할 필요가 없습니다.