2016-12-12 1 views
1

일부 데이터를 저장하기 위해 연결된 목록을 사용하도록 요청하는 과제가 있지만 <stdio.h> 만 사용할 수 있습니다.malloc없이 다른 접근 방식을 사용하는 연결된 목록

배열을 사용하려고 생각했지만 배열의 끝에 도달 할 경우 배열을 확장 할 수 없습니다 (여기서 읽을 수는 없습니다 : How can I change the size of an array in C? 약 15 분 전).

그렇다면 malloc 기능을 쓸 수 있을까요? 그러나 C에서 새로운 노드이기 때문에 나에게 문제가된다.

또 다른 추측은 반환 값보다 함수의 변수에 할당하여 새로운 노드를 만들 것을 생각하고 있었다. 함수에서 변수를 정의하면 함수가 잘못된 함수를 호출 할 때마다 메모리 크기만큼 새 메모리를 할당 할 것이라고 생각했습니다.

지금, 무엇을해야할지 모르겠다. 허용해야한다고 주장해야합니까? <stdlib.h>? 아니면 거기에 방법이있다 또는 그냥 링크 된 목록 배열을 사용해야합니까?

+0

'malloc'는 stdio.h''내에 있지 않습니다. 'struct'의 배열을 가지고 링크 인덱스를 링크로 사용하거나 링크가 없다면'-1'을 사용하여 링크 된리스트를 구현할 수 있습니다. 역동적 인 사건을 원한다면, 사용 가능한 요소의 또 다른 연결된 목록을 가질 수 있습니다. –

+0

고정 크기 배열을 메모리 소스로 사용하거나 불확정 크기를 처리해야합니까? 고정 크기 배열을 사용할 수있는 경우 목록 노드를 할당 할 수 있습니다. –

+0

초보자 인 경우에는 할당자를 직접 작성할 필요가 없습니다. 할당 할 고정 크기 배열을 사용해야합니다. 저장소가 가득 차면 저장소를 확장해야합니까? – molbdnilo

답변

2

힙 (malloc, calloc 등)에 목록을 만들 수 없으므로 메모리 요구 사항을 선언하고 해당 메모리를 목록 구조 내에서 내부적으로 관리해야합니다.

시작하겠습니다.

#define LIST_MEM_POOL 1024 
#define NODE_MEM_POOL 1024 

typedef struct { 
    int item; /* Assuming you are storing integers in the linked list */ 
    struct Node *next; 
} Node, *Pnode; 

typedef struct { 
    struct Node *head; /* Assuming singly linked list */ 
    int size; 
} List, *Plist; 

static List list_memory[LIST_MEM_POOL]; 
static Node node_memory[NODE_MEM_POOL]; 

static int used_lists = 0, free_lists = LIST_MEM_POOL; 
static int used_nodes = 0, free_nodes = NODE_MEM_POOL; 

Plist create_list(void) { 
    Plist l = 0; 
    if (used_lists < free_lists) { 
     l = &list_memory[used_lists++]; 
     l->size = 0; 
     l->head = 0; 
    } 
    return l; 
} 

노드를 만드는 데 목록을 만드는 데 사용 된 것과 동일한 아이디어를 적용 할 수 있습니다.


이 메모리를 직접 관리하는 측면에서 걱정해야 할 몇 가지 문제가 있습니다

  • 이 어떻게 사용 가능한 메모리를 처리하는 것은?
  • 누군가 두 개의 목록을 만들고 첫 번째 목록을 비우고 명이 새 목록을 만들려고하면 어떻게됩니까?
  • 누군가가 목록을 만들고 메모리가 없으면 을 사용할 수 있습니까? 상자 밖으로 생각
1

)

#include <stdio.h> 

#define N  0x20 

struct data_struct 
{ 
    char data_array[1]; 
    struct data_struct *next; 
}; 

int main() 
{ 
    FILE * fp; 
    unsigned int i; 
    static struct data_struct head = {0}; 
    static struct data_struct tmp = {0}; 

    fp = fopen("file.dat", "w+"); 

    head.data_array[0] = 'A'; 
    head.next = (struct data_struct *)(ftell(fp) + sizeof(struct data_struct)); 

    fwrite(&head, 1, sizeof(struct data_struct), fp); 

    for(i = 0; i < N; i++) { 
     tmp.data_array[0] = 'B' + i; 
     tmp.next = (struct data_struct *)(ftell(fp) + sizeof(struct data_struct)); 
     fwrite(&tmp, 1, sizeof(struct data_struct), fp); 
    } 

    fseek(fp, 0, SEEK_SET); 

    fread(&head, 1, sizeof(struct data_struct), fp); 

    for(i = 0; i < N; i++) { 
     printf("data_array: %c\n", head.data_array[0]); 

     fseek(fp, (unsigned int)head.next, SEEK_SET); 
     fread(&head, 1, sizeof(struct data_struct), fp); 
    } 
} 
+0

좋은 생각, 단지 ''... 및 확장 가능. fixe하지만 버퍼 크기가 큰'setbuf()'를 추가하면 검색 기능 중에 성능을 향상시켜야합니다. –

+0

답변을 주셔서 감사합니다. 오늘 퀴즈를 맺어서 충분한 답변을 드릴 수 없었습니다. C에서 파일 프로세스를 경험하지 못했습니다. 토요일까지 퀴즈와 중간 고사를 한 번 더 가질 것이므로이 과제를 처리하는 것을 지연해야하며 보조자에게 을 사용하도록 설득 할 수없는 경우 제안을 시도 할 것입니다. :) –

관련 문제