gpt4 book ai didi

c - 不同链表结构的函数addnode

转载 作者:行者123 更新时间:2023-11-30 15:54:39 24 4
gpt4 key购买 nike

有没有办法为不同的结构编写单个函数(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;
}

如果有两个结构,我可以编写两个函数,但如果我有两个以上的函数,我该怎么办?

最佳答案

与其使用不同的struct来表示链表,可能的解决方案是使用具有void*的单个链表struct数据成员。这将允许单个 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 .

关于c - 不同链表结构的函数addnode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12834779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com