需要一些关于链接列表的帮助;

时间:2010-08-08 01:59:39

标签: c

我在理解链表代码中的指针和结构定义时有一个简单的问题。

1)

typedef struct node
{
 struct node* next;
 int val;

}node;

这里如果我在初始化node * head时使用两个“node”;我指的是哪个节点?

2)这里我在struct中使用了一个int val。如果我使用void *而不是int那么有什么东西会改变吗?

3)如果我传递给函数

reverse(node* head)
{
    node* temp = head; or node* temp = *head;     
    //what is the difference between the two
}

如果这些是愚蠢的问题,我很抱歉我是c语言的新手。

谢谢&问候, 布雷特

3 个答案:

答案 0 :(得分:0)

&LT 1为卤素; 在C中,您需要为结构

指定结构节点
    struct node 
    {
...
    } node;

最后一个'node'是struct node类型的变量 例如

node.val = 1;

而不是类型。

如果你想使用'node'作为你需要写的类型

typedef struct node { .. } node;

&LT 2 - ; 如果使用void *,则需要一种机制来处理指针指向的内容,例如如果void *指向一个整数,则需要将整数保留在堆栈或堆上。

node n;
int value = 1;
n.val = &value; // pointing to a single integer on stack

int values[]={1,2,3};
n.val = values; // pointing to an array of integers on stack

void* ptr = malloc(sizeof(int));
n.val = ptr;  // pointing to a single (uninit) integer allocated on heap
int* ptrval = (int*)ptr; // setting an int ptr to the same memory loc.
*ptrval = value; // ptrval now points to same as n.val does

&LT 3的密度; 反转(节点*头) head是指向列表的指针,* head是指针指向的内容(下面的第一个节点)

  

head-> [node next] - > [node next] - > [node   下一个]

编辑:改编和编辑。 EDITx2:显然问题已被编辑,并且添加了typedef,因此问题被更改了。

答案 1 :(得分:0)

*head是指针的取消引用:即指针head指向的内存中的实际位置......

head视为衣架,将*head视为大衣本身,如果有帮助的话。

即:

struct * coat c; //this is a coat hanger, not a coat
....
struct coat k = *c;//this is the coat itself, not a coat hanger 

答案 2 :(得分:0)

对于#1:

在C中,struct具有单独的名称空间。所以如果你写了:

struct foo { ... };

然后,您必须使用struct foo来引用该类型。如果您在上面的定义之后只尝试foo,编译器会给出错误,因为它不知道有关该非限定名称的任何信息。

typedef为类型提供备用名称。 typedef名称不需要限定,所以一旦你这样做了:

typedef struct foo foo;

您现在可以使用不合格的foo来引用该类型。由于它只是一个替代名称,您现在可以互换使用struct foofoo

#2。

如果您将val更改为void *,则可能会更改整个结构的大小。这是否有所作为取决于你编写其余代码的方式。