数据结构之链栈基本操作(C语言)

链栈

栈的链式储存结构称为链栈。链栈的节点类型与链式线性表的节点类型

定义相同,不同的是它是仅在表头进行操作的单链表。链栈通常用不带头节

点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示:

数据结构之链栈基本操作(C语言)_第1张图片
程序源代码:

#include 
#include 
typedef int ElemType;

typedef struct stack{
	ElemType data;
	struct stack *next;
}stack,*Linkstack;

/*Function:栈的初始化*/ 
Linkstack Initstack(Linkstack s){
	s=NULL;  //栈顶指向NULL 
	return s; 
} 
/*Function:压栈*/ 
Linkstack Push(Linkstack s,ElemType e){
	Linkstack p; //新结点 
	p=(Linkstack)malloc(sizeof(stack));
	p->data=e; //新结点赋值 
	p->next=s; 
	s=p;
	printf("%d入栈\n",s->data);
	return s;
}
/*Function:出栈 */ 
Linkstack Pop(Linkstack s)
{
	Linkstack p;
	if(s==NULL){
		return;
	}
	printf("%d出栈\n",s->data);
	p=s;s=s->next;free(p);
	return s;
}
/*Function:获取栈顶元素 */ 
ElemType getTop(Linkstack s){
	if(s!=NULL){
		return s->data;
	}
}
/*Function:输出栈中所有元素*/ 
void PrintAll(Linkstack s)
{
	if(s==NULL){
		printf("栈为空!\n");
		return;
	}else{
		printf("顶端[");
	while(s!=NULL){
		printf("%d-",s->data);
		s=s->next;
	   }
	   printf("]底端\n");
	}
}
/*主函数*/ 
void main(){
	Linkstack s;
	s=Initstack(s);
	s=Push(s,3);
	s=Push(s,4);
	s=Push(s,5);
	PrintAll(s);
	s=Pop(s);
	s=Pop(s);
	PrintAll(s);
}

执行结果:

数据结构之链栈基本操作(C语言)_第2张图片

但是有的同学不理解上面的程序中为什么Push函数和Pop函数中传入的是结构体的地址,为什么还要返回头指针地址值?
这是因为这里头指针的地址发生了改变,我们在回忆一下c语言做过的数值交换问题,我们必须操作这两个数的
地址才能实现正真的交换。这里同样,如果想要保存头指针的地址值,我们就要使用二维指针,这样函数运行
完后头指针的地址值才能保存。以下程序就是用的二维指针来实现头指针地址的保存。(上面的程序能保存头
指针地址是因为我们返回了头指针地址,c语言中可以对返回值保留一次,所以可以正确执行)
#include 
#include 
typedef int ElemType;

typedef struct stack {
	ElemType data;
	struct stack* next;
}stack, * Linkstack;

///*Function:栈的初始化*/
//void Initstack(Linkstack * s) {
//	(*s) = NULL;  //栈顶指向NULL 
//}

/*Function:压栈*/
void Push(Linkstack * s, ElemType e) {
	Linkstack p = NULL; //新结点 
	p = (Linkstack)malloc(sizeof(stack));
	p->data = e; //新结点赋值 
	p->next = *s;
	(*s) = p;
	printf("%d出栈\n", (*s)->data);
}
/*Function:出栈 */
void Pop(Linkstack * s)
{
	Linkstack p;
	if ((*s)== NULL) {
		return;
	}
	printf("%d出栈\n", (*s)->data);
	p = *s; *s = (*s)->next; free(p);
}
/*Function:获取栈顶元素 */
ElemType getTop(Linkstack s) {
	if (s != NULL) {
		return s->data;
	}
}
/*Function:输出栈中所有元素*/
void PrintAll(Linkstack  s)
{
	if (s == NULL) {
		printf("栈为空!\n");
		return;
	}
	else {
		printf("顶端[");
		while (s != NULL) {
			printf("%d-", s->data);
			s = s->next;
		}
		printf("]底端\n");
	}
}
/*主函数*/
void main() {
	Linkstack * s=NULL;
	Push(&s, 3);
	Push(&s, 4);
	Push(&s, 5);
	PrintAll(s);
	Pop(&s);
	Pop(&s);
	PrintAll(s);
}

执行结果:
数据结构之链栈基本操作(C语言)_第3张图片

以上就是c语言链栈基本操作,如果觉得这篇文章不错的话那就点个赞吧!

你可能感兴趣的:(数据结构,数据结构)