Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generic linked list?

I was wondering if that was possible to use generic function for linked lists in C, (i don't want to do that in C++ but in C) example :

struct first_struct
{
    struct first_struct *next;
    int a;
    int b;
};
struct second_struct
{
     struct second_struct *next;
     int a;
     int b;
     int c; // just one more variable than first-struct
};

am i force to make a function each time for the two lists :

add_node(struct first_struct *mystruct)// doesn't matter the function here juste let's assume they add correctly a node
add_node1(struct second_struct *mystruct)
//and so on each time i want to make some others function always make them twice

or is there a better way to do that ?

like image 671
abt jeremie Avatar asked Jan 03 '23 11:01

abt jeremie


1 Answers

The better way is to abstract out the link handling (what makes a structure into a list node) and then re-use that by starting each listable structure with the node structure.

Like so:

struct list_node {
  struct list_node *next;
};


struct first_struct {
  struct list_node list_node;
  int a;
  int b;
};


struct second_struct {
  struct list_node list_node;
  int a;
  int b;
  int c;
};

Then make list functions that deal with (pointers to) struct list_node.

This is commonly called "intrusive lists", since it requires the application-level data structure to "know" that it's possible to put it in a list. It also means an instance of a structure can only be on one list at a time.

The other way is to make a list library that only deals with pointers to data (void *), that removes the limitation but brings others instead (more heap allocation, annoying when data is small).

like image 91
unwind Avatar answered Jan 04 '23 23:01

unwind