【问题标题】:C linked list push function, just checking if this is correctC链表推送功能,只检查是否正确
【发布时间】:2012-10-25 20:46:10
【问题描述】:

所以我只是想知道这个将新值推送到链表堆栈顶部的推送函数是否正确

void push(node** hd, int v){
node temp;
temp = (node*)malloc(sizeof(node));
temp -> val = v;
temp -> next = *hd;
*hd = temp;

}

提前致谢!

我还想知道如何创建一个弹出函数,将最近推送的值从堆栈中弹出。

顺便说一下,结构体代码是这样的……

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

typedef node* list;

【问题讨论】:

  • 看起来肯定有问题。 SUGGESTION:为什么不在调试器下编译运行呢?
  • 我不知道如何使用我的 gdb 调试器,因为我没有时间完成这个我一定会为将来学习它.. :\ 如果问题很明显我想要只知道。这是我第一次使用链接列表,而且我对 C 语言中的指针不太擅长。
  • 您的编辑实际上让事情变得更糟。请重新阅读@William Morris 的答案。 (我同意:类型定义指针只会增加混乱)

标签: c list pointers linked-list stack


【解决方案1】:

不要定义指针类型。他们令人困惑。定义一个普通类型并显式取消引用它。这是您在没有指针类型的情况下尝试做的事情。

#include <stdlib.h>
#include <stdio.h>

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

static void push(node **head, int v)
{
    node *temp = malloc(sizeof(node));
    temp->val = v;
    temp->next = *head;
    *head = temp;
}

int main(int argc, char **argv)
{
    (void) argv;
    (void) argc;
    node *list = NULL;

    for (int i=0; i<10; ++i) {
        push(&list, i);
    }
    for(node *l = list; l != NULL; l = l->next) {
        printf("%d ", l->val);
    }
    printf("\n");
    return 0;
}

请注意,您应该检查malloc 是否失败。换句话说,malloc 可以返回 NULL,这应该被处理 - 留给你。

【讨论】:

  • 对于 malloc 不是我在做 node * temp = (*node)malloc(sizeof(node)); ?
  • 问题是应该是node temp而不是list temp,然后把malloc前面的(list)去掉?
  • 问题源于您使用了 typedef 指针 (typedef node* list;)。只是不要这样做。
  • 抱歉,我对代码中的哪些列表应该只用 node 替换,哪些应该用 node* 替换有点困惑。
  • 我做了,但是我留下了一堆列表,我应该将它们更改为 node* 还是 node?​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多