0

構造体ポインタ配列の成長について問題があります。

構造体に格納されたメモリ位置へのポインターの配列。

でも、何本収納できるかわかりません。

配列の動的な成長が必要です。

また、要素の 1 つを削除する必要がある場合もあります。

コードは次のとおりです:</p>

#include <stdio.h>
#include <stdlib.h>

struct dominate * realloct(int* dim_1, struct dominate *dominateList)
{
    int i;
    struct dominate *dominateList_temp = (struct dominate *)malloc(sizeof(struct dominate *)*(*dim_1+10));

    for(i = 0; i < *dim_1+10;i++)
    {
        if(i<*dim_1)
        {
            dominateList_temp[i] = dominateList[i];
            //memcpy(b[i], a[i], (long)(sizeof(int)*(*dim_1)));
        }
        else
            dominateList_temp[i] = (struct dominate *)malloc(sizeof(struct dominate *)*dim_1);
    }
    (*dim_1) = (*dim_1)+10;

    return dominateList_temp;
}

struct dominate
{
    double ID;
};

struct dominate *head;

int main()
{
    int i;
    struct dominate *dominateList;
    struct dominate *dominateList_temp;
    int dim_1 = 10;

    struct dominate *z[100];

    for(i = 0; i < 100; i++){
        head = (struct dominate *) malloc(sizeof(struct dominate *));
        head->ID = i;
        z[i] = head;
    }


    dominateList = (struct dominate *)malloc(sizeof(struct dominate *)*dim_1);

    for(i = 0; i < 100; i++){
        if(i == dim_1 )
        {
            dominateList_temp = realloct(&dim_1, dominateList);
            free(dominateList);
            dominateList = dominateList_temp;
        }
    }

    printf("%d \n\n", dim_1);

    for(i = 0; i < 100; i++){
        printf("%.2lf ", dominateList[i].ID);
        printf("\n");
    }   
    return 0;
}

この問題を修正する方法がわかりません

if(i<*dim_1){
    dominateList_temp[i] = dominateList[i];
    //memcpy(dominateList_temp[i], dominateList[i], (long)(sizeof(struct dominate *)*dim_1);
}
else
    dominateList_temp[i] = (struct dominate *)malloc(sizeof(struct dominate *)*dim_1);

また、配列の要素を削除したい場合、どうすればいいですか?

4

2 に答える 2

2

C++ では、次のように使用しますstd::vector<dominate>

std::vector<dominate> d1;
d1.push_back(dominate()); // add a default constructed dominate object

std::vector<dominate> d2(100); // construct a vector with 100 default constructed dominate objects
dominate dom = ..... ;
d2[45] = dom; 
于 2012-11-24T08:11:23.050 に答える
0

これを C と C++ の両方としてタグ付けしたので、そのうちの 1 つだけに答えます。C++ でそのような動作が必要な場合は、自分で実装しないでください。これらはすべて、標準のテンプレート ライブラリで既に行われています。std::list (大量の挿入または途中での削除を行い、より長い項目検索時間を受け入れる場合) または std::vector (高速な項目検索が必要であるが、挿入または削除により長い時間を受け入れる場合) を使用するだけですリストの真ん中の項目)。

あなたのコードを見る:

  • C を使用しているため、タグを間違えている可能性があります。
  • あなたが欲しいstd::list <dominate>
于 2012-11-24T08:13:05.970 に答える