>我使用链表实现了堆栈。以下是 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->size
不0
,您也会将其重新分配给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 *
类型,该类型会自动转换为它所分配到的指针类型。