我需要编写一个程序来从堆栈中删除奇数,但是如何实现呢?
我知道我很迷失自己该做什么,在我的脑海里我的逻辑是正确的,但当然不是。
#include <stdio.h>
#include <stdlib.h>
typedef struct n{
int info;
struct n *prox;
}node;
typedef struct p{
node *top;
}stack;
stack* create (){
stack *p = (stack*) malloc(sizeof(stack));
p->top = NULL;
return p;
}
void push (stack* p, int dado){
node *new = (node*) malloc(sizeof(node));
new->info = dado;
new->prox = p->top;
p->top = new;
}
void shows (stack* p){
node *aux;
for (aux=p->top; aux != NULL; aux=aux->prox){
printf("%i\n",aux->info);
}
}
int empty (stack *p){
return (p->top == NULL);
}
void freestack (stack* p){
node *aux = p->top;
while (aux != NULL) {
node *temp = aux->prox;
free(aux);
aux = temp;
}
free(p);
}
int pop (stack* p){
if (empty(p)) {
printf("empty stack.\n");
exit(1);
}
int temp = p->top->info;
node *aux = p->top;
p->top=aux->prox;
free(aux);
return temp;
}
void oddnumbers(stack*p){
node *aux = p->top;
while(!empty(p)){
if(aux->info % 2 == 0){
aux = aux->prox;
}
else{
pop(p);
}
}
}
int main(int argc, char *argv[]) {
stack *p1 = create();
push(p1,72);
push(p1,31);
push(p1,98);
push(p1,21);
push(p1,45);
push(p1,10);
shows(p1);
oddnumbers(p1);
shows(p1);
freestack(p1);
return 0;
}
我的逻辑是,当堆栈不为空时,代码将执行一个 IF,如果堆栈的实际节点的信息是偶数,它将移动 aux var(aux var 是一个 var也指向栈顶)下一个节点,如果实际节点的信息是奇数,它将弹出。
您的方法的问题在于您使用
pop
来删除堆栈中间的节点。这不是 pop
所做的 - 它删除了前面的元素。
所以你需要另一个可以删除节点的函数,例如堆栈的中间。
由于您的堆栈基于单链表,因此您需要一个指向要删除的元素的指针和一个指向前一个元素的指针。
它可能看起来像:
void remove_node(stack* p, node *aux, node *prev) {
if (aux == NULL) exit(1); // Illegal call
if (prev == NULL) {
// Remove front element
p->top = aux->prox;
} else {
// Remove non-front element
prev->prox = aux->prox;
}
free(aux);
}
void oddnumbers(stack*p){
node *aux = p->top;
node *prev = NULL;
while(aux != NULL){
if(aux->info % 2 == 0){
prev = aux;
aux = aux->prox;
}
else{
node* tmp = aux;
aux = aux->prox;
remove_node(p, tmp, prev);
}
}
}