栈链表等初始化的思考

Posted hanxinle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈链表等初始化的思考相关的知识,希望对你有一定的参考价值。

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

以上是关于栈链表等初始化的思考的主要内容,如果未能解决你的问题,请参考以下文章

垃圾回收机制和数据结构栈链表

第二章最基本的数据结构——队列栈链表

数据结构栈

数据结构:第二章学习小结

删除双向链表最后一个元素

创建二叉树创建链表等