#include <stdio.h> #include <stdlib.h> struct stacknode { int data; stacknode * next; }; //void init(stacknode *s) { //这种初始化方法导致,建立了一个节点,将这个值赋给s,s的值改变了,这和传值调用函数,调用后函数没有改变的情形一致。
//在main中,声明stacknode stack后,它的值是0xCCCCCCCCC,调用init()后,其next值不会变为NULL,通过指针改改变结构体值的方式可以是
//1、改变指针变量的值,即函数返回类型是stacknode *,赋值给s,这样s指向的内容的改变,通过访问s后可知其next的值此时为NULL,实现见下一个函数init()函数 // s = (stacknode*)malloc(sizeof(stacknode)); // s->next = NULL; //} stacknode * init() { //正确实现 stacknode *s = (stacknode*)malloc(sizeof(stacknode)); s->next = NULL; return s; } //2、通过传地址(指针)修改结构体的值的实现是:
void init(stacknode **s) { (*s) = (stacknode*)malloc(sizeof(stacknode)); (*s)->next = NULL; }
//一般会犯的错误是以为参数传递的是某类型的地址,那么就以改变这一类型的值,实际上,有个条件,即通过调用指针的方式改变值,这个传入到函数内部的指针的值是不能改变的。
//注释掉的init() 函数所犯的就是这个错误,传入init的为某个stacknode类型的地址值,在init内部,s变成了新创建的地址值。这样,init调用过程成了传值调用,调用后s值没有改变
int isEmpty(stacknode * s) { if (s->next == NULL) return 1; else return 0; } void push(stacknode * s,int v) { stacknode * newnode = (stacknode*)malloc(sizeof(stacknode)); newnode->data = v; newnode->next = s->next; s->next = newnode; } stacknode * pop(stacknode * s) { stacknode * p; if (isEmpty(s)) return NULL; else { p = s->next; s->next = s->next->next; } return p; } int main(void) { stacknode *stack = init(); int n = 1348; while (n) { push(stack, n % 8); n = n / 8; } stacknode * m = NULL; while (!isEmpty(stack)) { m = pop(stack); printf("%d", m->data); }
//调用void init(stacknode **)实现进制转换 stacknode stack; stacknode * ps = &stack; init(&ps); int n = 1348; while (n) { push(ps, n % 8); n = n / 8; } stacknode * m = NULL; while (!isEmpty(ps)) { m = pop(ps); printf("%d", m->data); }
return 0;
}