消除在链表程序中使用typedef

时间:2015-03-01 18:59:53

标签: c typedef

我正在研究链表和(其中更简单的实现)我遇到了这个例子:

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 我无法理解我应该做出哪些更改。我尝试了一些解决方案,但它们没有用。

3 个答案:

答案 0 :(得分:1)

typedef就像复杂声明的简单命名一样。

很容易编写slist而不是struct ListNode_tag *

将所有ListNode替换为struct ListNode_tagslist 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*。由于sListListNode*相同,只需将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;
}

考虑到您还需要编写一个将释放列表中所有已分配内存的函数。