• 栈、链表等初始化的思考


    #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;

    }

  • 相关阅读:
    codeforces 616B Dinner with Emma
    codeforces 616A Comparing Two Long Integers
    codeforces 615C Running Track
    codeforces 612C Replace To Make Regular Bracket Sequence
    codeforces 612B HDD is Outdated Technology
    重写父类中的成员属性
    子类继承父类
    访问修饰符
    方法的参数
    实例化类
  • 原文地址:https://www.cnblogs.com/hanxinle/p/11163826.html
Copyright © 2020-2023  润新知