2016-12-12 2 views
1

データを保存するためにリンクリストを使用するように指示していますが、<stdio.h>しか使用できません。mallocを使わずに別の方法でリンクしたリスト

私はarrayを使用することを考えていましたが、配列の終わりに達した場合に配列を拡張することはできません(これは、ここから読むことはできません: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; 
} 

リストの作成に使用したのと同じ考え方をノードの作成に適用できます。


あなたはこのメモリを自分で管理するという点で心配する必要があるいくつかの問題があります。

  • どのようにして空きメモリを扱うでしょうか?
  • 誰かが2つのリストを作成して最初のリストを解放し、 が新しいリストを作成しようとするとどうなりますか?
  • 誰かがリストを作成しようとしたときに、メモリがありません が利用できますか?箱から出して考えて
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でファイルプロセスを経験していません。私は土曜日までにもう1つのクイズと中間結果を持っていますので、この課題を処理するのを遅らせる必要があり、アシスタントにを使用させることができない場合は、 –

関連する問題