使用C在链接列表中堆栈但我的推送方法有错误

时间:2018-06-16 06:22:08

标签: c data-structures linked-list

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

typedef struct node{
    int data;
    struct node *next;
}node;

void init(node* head, node* tail){
    head = (node*)malloc(sizeof(node));
    tail = (node*)malloc(sizeof(node));
    head->next = tail;
    tail->next = tail;
}

void push(node* head, int data){

    node *temp;
    temp = (node*)malloc(sizeof(node));

    if(temp == NULL){
        printf("%s", "Out Of Memory");
    }else{
        temp->data = data;
        temp->next = head->next;

在下一行,有printf方法打印7号。 它是用于调试的。但这种printf方法并没有奏效。所以我注意到了

temp->next = head->next; 

此代码有错误。但我找不到原因.. 我在考虑内存分配问题。但仍然没有得到它......!

        printf("%d", 7);
        head->next = temp;
        printf("push (%d)", data);
    }
}

void main(){
    node* head = NULL;
    node* tail = NULL;
    init(head, tail);
    push(head, 10);
}

3 个答案:

答案 0 :(得分:3)

void init(node** head, node** tail){
    *head = malloc(sizeof(node));
    *tail = malloc(sizeof(node));
    (*head)->next = *tail;
    (*tail)->next = *tail;
}

void main(){
    node* head = NULL;
    node* tail = NULL;
    init(&head, &tail);
    push(head, 10);
}

你应该通过引用传递head和tail来反映调用函数main()中head和tail的更改值。

有关传递参考的更多信息,请检查this

答案 1 :(得分:1)

1)您不需要也不需要初始化功能。 head为NULL时,堆栈被视为空。所以head = NULL;就足够了。

2)堆栈不需要tail指针,因为元素总是在前面插入/移除

3)您的push函数必须允许更新head一种方法是返回新头。另一种方法是将指针传递给head

4)链接列表没有tail->next = tail;next为NULL时,到达列表的末尾。因此,如果您有tail,那么tail->next = NULL;

使用&#34;返回新头的堆栈&#34;更像是:

node* push(node* head, int data){

    node *temp = malloc(sizeof(node));

    if(temp == NULL){
        printf("%s", "Out Of Memory");
        return head;
    }

    temp->data = data;
    temp->next = head;   // notice this
    return temp;
}

int main(){
    node* head = NULL;
    head = push(head, 10);
    return 0;
}

使用&#34;堆栈将指针传递给头部&#34;更像是:

void push(node** headPtr, int data){

    node *temp = malloc(sizeof(node));

    if(temp == NULL){
        printf("%s", "Out Of Memory");
        return;
    }

    temp->data = data;
    temp->next = *headPtr;   // notice the *
    *headPtr = temp;
}

int main(){
    node* head = NULL;
    push(&head, 10); // notice the &
    return 0;
}

答案 2 :(得分:1)

您可以从代码中一起删除init函数,并且不需要尾部。 如果要将其用于调试,则main可能如下所示。

node* head = NULL;
node* tail = NULL;
head = (node*)malloc(sizeof(node));
tail = (node*)malloc(sizeof(node));

head->next = tail;
tail->next = tail;