c - 删除一个元素后堆栈弹出操作不起作用



>我使用链表实现了堆栈。以下是 C 程序。

#include <stdio.h>
#include <stdlib.h>
typedef struct StkElmt_{
    int data;
    struct StkElmt_* next;
}stackelmt;
typedef struct stack_{
    stackelmt* head;
    stackelmt* tail;
    int size;
}stack_t;

void stack_init(stack_t* stack){
    stack->head = NULL;
    stack->tail = NULL;
    stack->size = 0;
}

int stack_insert(stack_t* stack, int data){
    stackelmt* new_element = (stackelmt*)malloc(sizeof(stackelmt));
    new_element->data = data;
    if (stack->size = 0)
        stack->tail = new_element;
    new_element->next = stack->head;
    stack->head = new_element;
    stack->size++;
}
int stack_del(stack_t* stack){
    int data;
    stackelmt* old_element;
    if (stack->size == 0)
        return -1;
    data = stack->head->data;
    old_element = stack->head;
    stack->head = stack->head->next;
    if (stack->size == 1)
        stack->tail = NULL;
    free(old_element);
    stack->size--;
    return 0;
}
void printstack(stack_t* stack){
    stackelmt* point = (stackelmt*)malloc(sizeof(stackelmt));
    for (point = stack->head; point != NULL; point = point->next)
        printf("n(_%d_)n  ", point->data);

}

void insertfunction(stack_t* stack, int max){
    int x;
    for (int i=0; i<max; i++){
        scanf("%d", &x);
        stack_insert(stack, x);
    }
    printf("the stack is: n");
    printstack(stack);
}

void deletefunction(stack_t* stack, int num){
    for (int j=0; j<num; j++)
        stack_del(stack);
    printstack(stack);
}
void utilityfunction(){
    int userinput, maxinput, maxdel;
    stack_t* stack = (stack_t*)malloc(sizeof(stack_t));
    stack_init(stack);
    while (1) {
        printf("n1 to insert elements in the stackn2 to delete elements in the stackn3 to breakn");
        scanf("%d", &userinput);
        switch(userinput){
            case 1:
                printf("nEnter how many elements you want to push into stack: ");
                scanf("%d", &maxinput);
                insertfunction(stack, maxinput);
                break;
            case 2:
                printf("nEnter how many elements you want to pop from stack: ");
                scanf("%d", &maxdel);
                deletefunction(stack, maxdel);
                break;
            case 3:
                break;
            default:
                printf("Invalid inputn");
                break;
        }   
    }   
}
int main(){
    utilityfunction();
    return 0;
}

插入操作工作正常。例:

Enter how many elements you want to push into stack: 5
1
2
3
4 
5
the stack is: 
(_5_)
(_4_)
(_3_)
(_2_)
(_1_)

但是,当调用删除函数时,会从堆栈中弹出"num"数量的元素。但以下情况会发生。

Enter how many elements you want to pop from stack: 3
(_4_)
(_3_)
(_2_)
(_1_)

虽然我想从堆栈中弹出 3 个项目,但只有一个项目弹出,即 5 个。

代码中的错误是什么?

if (stack->size = 0)

在函数中,stack_insert() 会将大小设置为零,稍后stack->size++;会将大小设置为 1。

然后,stack_del()将查看大小并认为堆栈只有一个元素。弹出一个元素,堆栈似乎没有元素,因此不会删除第二个元素或以后。

您应该启用编译器警告并进行比较

if (stack->size == 0)

而不是函数 stack_insert() 中的赋值。

另请注意,printstack()中分配的内存未被使用,它只是被丢弃并导致内存泄漏,您应该停止在那里分配它。

还有一点需要注意:他们说你不应该用 C 来投malloc()的结果。

stack_insert功能if (stack->size = 0)必须if (stack->size == 0)

原因:赋值运算符=始终计算为 true,您必须改用逻辑等号运算符==

因此,这意味着即使您的stack->size0,您也会将其重新分配给0并且执行stack->tail = new_element;


并使其返回类型void,因为您不会从函数返回任何内容


  • 所以,以下功能:

    int stack_insert(stack_t* stack, int data)
    {
      stackelmt* new_element = (stackelmt*)malloc(sizeof(stackelmt));
      new_element->data = data;
      if (stack->size = 0)
          stack->tail = new_element;
      new_element->next = stack->head;
      stack->head = new_element;
      stack->size++;
    }
    
  • 必须更改为 :

    void stack_insert(stack_t* stack, int data) //change 1
    {
        stackelmt* new_element = (stackelmt*)malloc(sizeof(stackelmt));
        new_element->data = data;
        if (stack->size == 0) //change 2
            stack->tail = new_element;
        new_element->next = stack->head;
        stack->head = new_element;
        stack->size++;
    }
    

进一步

  • 不要使用int main()而是使用int main(void) int main()可以接受任意数量的参数,但是,在这里您不会发送任何参数所以,int main(void)是合适的

  • 不要对malloc()的返回值进行种姓

例如:

stackelmt* new_element = (stackelmt*)malloc(sizeof(stackelmt));

将其更改为:

stackelmt* new_element = malloc(sizeof(stackelmt));

原因:成功分配malloc()返回void *类型,该类型会自动转换为它所分配到的指针类型。

相关内容

  • 没有找到相关文章

最新更新