有没有办法为不同的结构编写单个函数(addnode)?我有这种情况:
typedef struct linkedlist_a *ptr_a;
typedef struct linkedlist_a
{
/* content */
ptr_a next;
} listA;
typedef struct linkedlist_b *ptr_b;
typedef struct linkedlist_b
{
/* content */
ptr_b next;
} listB;
listA *listA_addnode( listA *head, listA *node )
{
listA *temp = head;
if( temp == NULL )
{
temp = node;
}
else if( temp -> next == NULL )
{
temp -> next = node;
}
else
{
while( temp -> next ) temp = temp -> next;
temp -> next = node;
}
return head;
}
listB *listB_addnode( listB *head, listB *node )
{
listB *temp = head;
if( temp == NULL )
{
temp = node;
}
else if( temp -> next == NULL )
{
temp -> next = node;
}
else
{
while( temp -> next ) temp = temp -> next;
temp -> next = node;
}
return head;
}
如果有两个结构对我来说可以写两个函数但是如果我超过2个,我该怎么办?
答案 0 :(得分:1)
可能的解决方案是使用具有struct
数据成员的单个链接列表struct
,而不是使用表示链接列表的不同void*
。这将允许单个add_node()
函数具有略微不同的签名。
例如:
struct linked_node
{
void* data;
struct linked_node* next;
};
void add_node(struct linked_node** a_head, void* a_data)
{
struct linked_node* new_node = malloc(sizeof(*new_node));
new_node->data = a_data;
new_node->next = 0;
if (!*a_head)
{
*a_head = new_node;
}
else
{
/* ... */
}
}
这种方法存在危险,即对data
成员的正确解释。但是,小心这种方法可以满足您的要求。
使用示例(省略错误检查):
struct data_x { int i; char c; };
struct data_y { char* s; };
struct linked_node* list_x = 0;
struct data_x* dx = malloc(sizeof(*dx));
dx->i = 4;
dx->c = 'a';
add_node(&list_x, dx);
if (list_x)
{
struct data_x* x = list_x->data;
printf("x.i=%d x.c=%c\n", x->i, x->c);
}
struct linked_node* list_y = 0;
struct data_y* dy = malloc(sizeof(*dy));
dy->s = "hello";
add_node(&list_y, dy);
if (list_y)
{
struct data_y* y = list_y->data;
printf("y.s=%s\n", y->s);
}
参见在线演示http://ideone.com/iZO8h。
答案 1 :(得分:0)
只有这样才能使用宏,假设您的链接元素被称为相同(next
存在于您希望传递的所有类型中。)
提前GNU样式代码:-std=gnu98
或更高
#define addnode( head, node ) ({\
typeof(head) _head = (head);\
typeof(node) _node = (node);\
if( _head == NULL )\
{\
_head = _node;\
}\
else\
{\
while( _head -> next ) _head = _head -> next;\
_head -> next = _node; \
}\
\
_head;\
})
这是非常糟糕的编程风格,但