2010-08-15 5 views

답변

4

C에서 배열은 여러 개체를 차례로 포함하는 고정 된 크기의 연속 저장 영역입니다. 이 배열은 C가 단어에주는 의미의 "객체"입니다. 기본적으로 뭔가를 나타내는 메모리입니다. 개체는 단지 int 일 수 있습니다.

배열 개체과 배열 사이를 약간 구별 할 수 있습니다. 종종 사람들은 배열 을 사용하여 malloc으로 할당되고 첫 번째 요소에 대한 포인터를 통해 사용됩니다. 그러나 C는 다른 크기의 배열과 가변 길이 배열에 대해서도 특정 유형을 가지고 있습니다.이 배열은 크기를 만들 때 설정됩니다. VLA는 다소 오도 된 이름을 가지고 있습니다 : 컴파일 타임에 고정되지 않는다는 의미에서 크기는 "가변적"입니다. 그것은 개체의 수명 동안 변경할 수 없습니다.

배열이 고정 크기라는 것은 배열이 만들어지면 크기를 변경할 수 없다는 것을 의미하며 여기에는 VLA가 포함됩니다.realloc은 논리적으로 이전 배열을 대체하는 새 배열에 대한 포인터를 반환하지만 전달 된 동일한 주소를 반환 할 수 있으며 배열의 크기를 변경합니다. realloc은 일반적으로 배열이 아닌 메모리 할당에서 작동합니다.

그게 배열입니다. C 프로그래밍 언어는 목록이라고하는 것을 정의하지 않습니다. 잘 정의 된 것을 비교할 수 없습니다 ;-) 일반적으로 "list"는 linked list을 의미하지만 일부 컨텍스트 또는 다른 언어에서는 다른 것을 의미합니다.

다른 언어에서 "배열"은 다른 것을 의미 할 수 있지만, C 배열과 매우 다른 것을 의미하는 언어를 즉시 생각할 수는 없습니다.

귀하의 질문에 정말 C와는 아무 상관이 없으며, 언어에 독립적 데이터 구조 질문, "? 배열과 연결리스트의 차이점은 무엇입니까"이 경우

는, 다음이의 중복입니다 :

Array versus linked-list

+0

설명에 감사드립니다 ......... –

+0

"[배열]은 C 배열과 다른 것을 의미하는 언어를 즉시 생각할 수 없습니다." PHP의 "배열"데이터 구조를보십시오. 그것은 내가 생각할 수있는 가장 다른 것입니다. – Jules

5

C자체list같은 아무것도 없지만 당신이 확실히 연결리스트 구현에 대해 이야기 할 수 있지만.

배열 : 임의 액세스, 크기 미리 정의.
링크 된 목록 : 순차적 액세스, 런타임의 크기.

Python과 같은 다른 언어는 listarray이 내장되어있어 그 의미가 다를 수 있습니다. 아래에서

유용한 코멘트 :

당신은 배열 목록을 추가 할 수 있습니다. 내부적으로 필요로 할 때 두 배로 배열되고 1/4 만 채워지면 배열을 반으로 줄이는 배열입니다. 이것은 add, remove, get (index) 상환에 O (1)을 준다. - lasseespeholt

파이썬의 list은 링크 된 목록이 아닙니다. 그리고 파이썬 listarray 사이의 구별은 list은 아무것도 저장할 수 있지만 배열은 기본 유형 (int, float 등) 만 저장할 수 있습니다. - KennyTM

+5

파이썬의'list'는 링크리스트가 아닙니다. 그리고 파이썬'list'와'array'의 구분은 무엇이든 저장할 수 있지만'array'는 원시 타입 (int, float 등) 만 저장할 수 있습니다. – kennytm

+0

배열 목록을 추가 할 수 있습니다. 내부적으로 필요로 할 때 두 배로 배열되고 1/4 만 채워지면 배열을 반으로 줄이는 배열입니다. 이것은 add, remove, get (index) 상환에 O (1)을 준다. –

+0

파이썬의 "목록"은 사실 다른 언어가 (동적 크기의) 배열이라고 부르는 언어입니다. – delnan

5

C에는 표준 목록과 같은 것이 없습니다. C++에는 double-linked list으로 구현되는 것이 있습니다.

주요 차이점

배열이 랜덤 액세스을 가지고있다 -는 O(1) 시간에 어레이의 모든 멤버에 액세스 (즉 a 배열, a[4] 경우) 및 컴파일 시간에 미리 설정된 크기를 가진다. 연결된 목록에 순차적 인 액세스 권한이 있습니다. 요소에 액세스하려면 원하는 요소에 도달 할 때까지 목록을 반복해야합니다 (예 : b이 연결된 목록 인 경우 b의 다섯 번째 요소로 이동하려면 요소를 반복해야합니다. 0, 1, 2, 3 및 4), 크기를 동적으로 늘리거나 줄일 수 있습니다.

+0

+1 @ Stephen : 좋은 답변입니다! – bguiz

+0

@Stephen : 배열은 동적 메모리 할당을 사용하여 런타임에 배열 크기를 설정할 수도 있지만 컴파일 타임에 정의 할 * 수는 없습니다. 선택할 프로그래머가 결정합니다. – bguiz

+0

크기 각 요소의 크기는 컴파일시 설정되므로 동적으로 생성 할 수 있다는 사실은 조회가 O (1) –

0

종종 링크 된 데이터 구조의 특성으로 인해 요소간에 연속적인 메모리 보증이 없기 때문에 메모리가 매우 조각난 상황에서 사용할 수 있습니다. 예를 들어 100MB의 여유 공간이 있지만 최대 사용 가능한 메모리의 길이는 10MB입니다. 이 경우 크기가 10MB이지만 잠재적으로 더 큰 링크 된 목록을 만들 수 있습니다. 단일 노드를 포함 할 수있을만큼 충분한 여유 메모리를 사용할 수 있기 때문입니다.

배열
1
  1. , 그것은 우리가 쓰기와 같은 고정 된 크기를 가지고, 새로운 INT [100] 하지만 목록 고정 된 크기를 가지고 있지 않습니다 ... 그것은에 가서

  2. 삽입에 수 및 삭제 배열 이유보다 목록에 쉽게 : 우리는 단순히 삽입 및 링크 된 목록을하지만 배열의 삽입과 삭제 삭제 포인터를 변경하는 데 사용할 수있는 shiftRight 및 shiftLeft이

  3. 링크 된 목록에 더미 헤드 노드를 사용 필요가 특별한 경우를 피하십시오. 빈 목록에 삽입하거나 단위 크기 목록에서 마지막 노드를 제거합니다. 두 방향으로 반복 할 수 있도록 이중 링크를 사용합니다. 물론 비용은 더미 노드 (최소 비용)를 유지하는 데 필요한 추가 공간이며 각 노드에 대한 일반적인 다음 링크 (훨씬 더 중요한 비용)에 추가로 이전 링크가 추가됩니다. 배열에서 , 우리는 랜덤 액세스 링크 목록에서

  4. 의 도움으로 추가 할 수 있습니다, 꼬리 노드에 대한 참조 (필요없이 우리에게 일정 시간의 목록에 추가 할 수있는 기능을 제공하는, 단순히 header.prev입니다 꼬리 참조를 찾기 위해 반복하거나 별도의 꼬리 참조를 유지해야 함). 그러나 배열에서는 삽입하기 전에 배열의 크기를 조정해야합니다.

  5. 배열은 링크 된 목록과 달리 임의 액세스를 얻을 수있는 유연성을 제공합니다. 그것은 우리가 사용하고있는 포인터에 대한 추가 메모리 저장을 소비

링크 된 목록과 같은 문제가있다!대신 O의 O (N)의

시간 복잡도는 (1)과 같은 배열로

반전 이송 단독 연결리스트 어렵다 우리는 이중 연결리스트를 사용하면, 다른 포인터는 추가 메모리 저장

더 의미

힙 제한도! 힙에 사용 가능한 공간이있는 경우에만 메모리가 할당됩니다. 메모리가 부족하면 메모리가 생성되지 않습니다.

배열

같은 문제 메모리 낭비 또는 부족의 가능성을 갖는다.

희망이 있습니다. :)

0

배열은 유사한 데이터 유형 (즉,)을 ​​가지며 본질적으로 동종입니다. 우리는 배열의 정수, 배열 등을 가질 수 있습니다. 배열의 크기 또한 미리 정의됩니다. 의 경우 목록에는 모든 유형의 요소가있을 수 있습니다. 문자열 정수 또는 둘 모두의 조합이되도록하십시오. 또한 null 또는 중복 요소가 목록에 허용됩니다. 목록의 예는 arraylist, linkedlist를 포함합니다. 목록에서 크기는 언제든지 커지거나 줄어들 수 있습니다.