Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Map like structure in C: use int and struct to determine a value

Tags:

I used to code in C++ and now I try to program in C.

Assume I have defined a struct

struct point{
    int x;
    int y;
}

Is there any data structure A in c that can support the following functionality: Given two integers, say i and j, and two points, say p1 and p2. A[i][j][p1][p2] can uniquely determine a value.

It sounds like a 4-d array. However, indexes are no longer a int, but user-defined struct.

like image 398
user3341338 Avatar asked Feb 22 '14 18:02

user3341338


People also ask

Which data structure is used by map?

The map data type is known as an associative array because, like an array, it is a collection of values and not a single value like an Int or a String. Also, each unique key is associated with a value, making it an associative array.

Can you use a map in C?

The C Programming Language by Kernighan and Ritchie has an example of making an associate map in c, and what I'll detail below is based on what I remember from that. Basically you'll need a struct Map that contains struct Key and struct Value.

How is struct used in C?

Structures (also called structs) are a way to group several related variables into one place. Each variable in the structure is known as a member of the structure. Unlike an array, a structure can contain many different data types (int, float, char, etc.).

How many ways can you define a structure in C?

There are two ways to declare structure variable: By struct keyword within main() function.


1 Answers

You'll probably have to make your own structure. The C Programming Language by Kernighan and Ritchie has an example of making an associate map in c, and what I'll detail below is based on what I remember from that.

Basically you'll need a struct Map that contains struct Key and struct Value.

struct Map {
    struct Key key;
    struct Value value;
};

struct Key contains elements that determine the value (in your case 2 points and 2 ints)

struct Key {
    struct point p1;
    struct point p2;
    int i;
    int j;
};

struct Value is whatever you want your key to point to (you didn't say)

You now have a struct Map that associates your four inputs with a value, but a single map isn't that useful. You're going to want a whole array of them.

struct Map map[SIZE_OF_MAP];

If you don't want to linearly search the array for the Map struct you're looking for, you can make a hashing function that will bring you directly to it. Just define a function that takes the key and uses its value to assign it an index in the array. Use the hash to place the Map in the array and retrieve it from the array. (Note: I'm unsure if this is a correct example of hashing, please correct if this is completely wrong)

int get_hash(Key *key)
{
    int result;
    /* combine all inputs in some way */
    result = key->i * key->i + (key->p1.x * key->p1.x) - (key->p2.x * key->p2.x)
    /* make sure result isn't out of bounds of the array */
    return (result % SIZE_OF_MAP);
}

If you use the hashing function you'll have to consider collisions (what happens when two keys give the same result for get_hash). When you use your array of Maps you'll need some form of collision resolution.

like image 195
gslavin Avatar answered Oct 04 '22 19:10

gslavin