我正在研究链表和(其中更简单的实现)我遇到了这个例子:
typedef struct ListNode_tag {
int data;
struct ListNode_tag * next;
} ListNode;
/* linked list */
typedef ListNode * slist;
void slistInsert (slist * lp, int t)
{
ListNode * n = (ListNode *) malloc(sizeof(ListNode));
n->data = t;
n->next = *lp;
*lp = n;
}
void slistPrint (slist l)
{
while (l != NULL) {
printf("%d\n", l->data);
l = l->next;}
}
int main ()
{
slist l = NULL;
slistInsert(&l, 13);
slistInsert(&l, 42);
slistPrint(l); //print 42 13
return 0;
}
...这似乎工作正常,但如果我必须消除使用typedef 我无法理解我应该做出哪些更改。我尝试了一些解决方案,但它们没有用。
答案 0 :(得分:1)
typedef就像复杂声明的简单命名一样。
很容易编写slist
而不是struct ListNode_tag *
将所有ListNode
替换为struct ListNode_tag
。 slist
struct ListNode_tag *
struct ListNode_tag {
int data;
struct ListNode_tag * next;
};
您的结构将如下所示
slistInsert()
void slistInsert (struct ListNode_tag **lp, int t)
声明看起来像这样
slistPrint()
void slistPrint (struct ListNode_tag * l)
声明看起来像这样
{{1}}
答案 1 :(得分:1)
typedef
只是一个别名,是已经存在的东西的不同名称。因此typedef ListNode * slist;
为slist
创建别名ListNode*
。由于sList
与ListNode*
相同,只需将slist
替换为ListNode*
。
另一个typedef,typedef struct ListNode_tag {...} ListNode;
为ListNode
创建别名struct ListNode_tag
。因此,将ListNode
替换为struct ListNode_tag
。在C中,关键字struct
必须包含在结构名称中。
答案 2 :(得分:1)
这是没有typedef(s)的程序。
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode * next;
};
/* linked list */
void slistInsert (struct ListNode **lp, int t)
{
struct ListNode * n = (struct ListNode *) malloc(sizeof(struct ListNode));
n->data = t;
n->next = *lp;
*lp = n;
}
void slistPrint (struct ListNode *l)
{
while (l != NULL) {
printf("%d\n", l->data);
l = l->next;}
}
int main ()
{
struct ListNode *l = NULL;
slistInsert(&l, 13);
slistInsert(&l, 42);
slistPrint(l); //print 42 13
return 0;
}
考虑到您还需要编写一个将释放列表中所有已分配内存的函数。