2

これは私の仕事ですが、家の仕事ではありません。私はネイティブデータ構造を使用して持っているデータを表現する最善の方法を決定しようとしています (ネイティブとは、C++ で STL を使用できないことを意味します。これは C++ コードです。STL を使用しないという設計上の決定は、方法がありません。変更するか違反します)

データは次のとおりです。

192.168.10.77 (これは 192.168.10.77 から一意に取得される int に格納されているとしましょう) という ipaddr を示す int という変数があり、deviceId を呼び出すことができます。

このような各 deviceId には、サービス 1、サービス 2 など、複数のサービスが関連付けられた他のフィールドがあります。各デバイスに関連付けられたサービスの数は、deviceId によって異なります。

したがって、データのサンプルは次のようになります。

192.168.10.77 

    service1

    service2

    service3

    service4

192.168.10.98

    service1

    service2

192.168.10.97

    service1

現在、以下のように非効率的なデータ構造に保存しています。

私は次のような構造体を持っています:

typedef struct
{
   deviceId d;
   serviceId s;
}mystr;

そして、保持する構造体の配列を使用します

mystr mylist[64];

したがって、この配列のエントリは次のようになります

mylist[0].d = 192.168.10.77

mylist[0].s = service1


mylist[1].d = 192.168.10.77

mylist[1].s = service2

mylist[2].d = 192.168.10.77

mylist[2].s = service3

mylist[3].d = 192.168.10.77

mylist[3].s = service4

mylist[4].d = 192.168.10.98

mylist[4].s = service1

mylist[5].d = 192.168.10.98

mylist[5].s = service2

... ... and so on ....

基本的に、deviceId 値は、関連付けられているサービスの数だけ複製されます。

後でデバイスに関連付けられたすべてのサービスをグループ化する必要があるため、より効率的なものが必要です。

そのためには、deviceId を検索し、そのサービスを一緒にクラブする必要があるかもしれません。deviceId は任意の値を持つ可能性があるため、どのように検索するのかわかりません。

最適なデータ構造を使用してこのデータを表現するより良い方法は何ですか?

[リンクされたリストとして表示できますが、それを思い付くことができませんでしstruct Node{ }た]

4

4 に答える 4

2

typedef struct
{ deviceId d;
serviceId s[100];
1 つのデバイスに対して複数のサービスが必要です

 `}mystr;  

mystr mylist[64];`

または、次のようなリンクリストを持つことができます

` struct デバイス {
デバイス ID; *サービス; }

 typedef struct serviceid{
 {
   *service;
 }service;

` 最後のサービス ID で null を指す

于 2013-02-25T16:25:11.287 に答える
0

このライブラリを基本的なハッシュテーブルとして保存するのはどうですか?

http://troydhanson.github.com/uthash/

免責事項:私は漠然とCに精通しているだけです

于 2013-02-25T16:57:13.720 に答える
0

あなたはサービスのリンクリストでデバイスのリンクリストを持つことができます

typedef Service{
 serviceId s;//store service id
 Service *nextService;//link to the different services supported by the device, end by null
}*deviceServiceList;

typedef struct Device{
 deviceId d;//store the device id
 Service *s;//store the list of service available for this device
}myDevices;

デバイスはデバイスの配列に保存するか、uはデバイスのリンクリストを作成できます

于 2013-02-26T13:41:16.280 に答える
0

gethostbyname と gethostbyaddr の使用を検討してください。最初に 1 つ試して、失敗した場合は、もう 1 つ試してください。次に、1 つの文字列を格納するだけで済みます。

于 2013-02-25T16:28:16.060 に答える