考研数据结构之栈(2.4)——练习题之用不带头结点的单链表来存储链栈实现操作(C表示)

题目

用不带头结点的单链表存储链栈,设计初始化栈、判断栈是否为空、进栈和出栈等相应算法。

分析

不带头结点的单链表L为空的条件是L==NULL,进栈和出栈操作都是在表头进行的。

入栈

考研数据结构之栈(2.4)——练习题之用不带头结点的单链表来存储链栈实现操作(C表示)_第1张图片

出栈

考研数据结构之栈(2.4)——练习题之用不带头结点的单链表来存储链栈实现操作(C表示)_第2张图片

代码

核心代码:

/* 初始化栈 */
/* *&list指的是要初始化的栈 */
void initStack(LNode *&list) { // list要改变,所以要用引用型
	list=NULL;// 将开始结点置为NULL 
}
 
/* 判断是否栈空,如果栈空返回1,否则返回0 */
/* *list指的是要进行判断的链栈 */
int isEmpty(LNode *list) {
	if(list==NULL) { // 栈空状态:list==NULL
		return 1;
	} else {
		return 0;
	}
}
 
/* 入栈 */
/* *list指的是要入栈操作的链栈;x指的是要新入栈的元素的data值 */
void push(LNode *&list,int x) {
	/* 申请新的进栈结点 */
	LNode *newNode;// 定义链栈结点 
	newNode=(LNode *)malloc(sizeof(LNode)); // 申请新结点 
	newNode->data=x;// 设置新结点的数据 
	newNode->next=list;// 设置新结点的next指向原开始结点(栈顶结点) 
	list=newNode; // 将新结点设置为栈顶结点 
}
 
/* 出栈 */
/* *list指的是要出栈的链栈;&x指的是出栈元素的data值 */
int pop(LNode *&list,int &x) {
	LNode *temp;// 定义一个临时变量用来保存栈顶结点 
	if(list==NULL) {// 判断是否栈空 
		return 0;// 如果栈空返回0 
	} else {
		temp=list;// 临时保存开始结点
		x=temp->data;// 保存要出栈结点的data值 
		list=temp->next;// 将出栈结点的下一个结点置为栈顶结点 
		free(temp);// 释放结点资源 
		return 1;// 出栈成功返回1
	}
}

完整代码:

#include 
#include 
 
#define maxSize 20
 
/* 链栈结点定义 */
typedef struct LNode {
	int data; // 数据域
	struct LNode *next;// 指针域
} LNode;
 
/* 初始化栈 */
/* *&list指的是要初始化的栈 */
void initStack(LNode *&list) { // list要改变,所以要用引用型
	list=NULL;// 将开始结点置为NULL 
}
 
/* 判断是否栈空,如果栈空返回1,否则返回0 */
/* *list指的是要进行判断的链栈 */
int isEmpty(LNode *list) {
	if(list==NULL) { // 栈空状态:list==NULL
		return 1;
	} else {
		return 0;
	}
}
 
/* 入栈 */
/* *list指的是要入栈操作的链栈;x指的是要新入栈的元素的data值 */
void push(LNode *&list,int x) {
	/* 申请新的进栈结点 */
	LNode *newNode;// 定义链栈结点 
	newNode=(LNode *)malloc(sizeof(LNode)); // 申请新结点 
	newNode->data=x;// 设置新结点的数据 
	newNode->next=list;// 设置新结点的next指向原开始结点(栈顶结点) 
	list=newNode; // 将新结点设置为栈顶结点 
}
 
/* 出栈 */
/* *list指的是要出栈的链栈;&x指的是出栈元素的data值 */
int pop(LNode *&list,int &x) {
	LNode *temp;// 定义一个临时变量用来保存栈顶结点 
	if(list==NULL) {// 判断是否栈空 
		return 0;// 如果栈空返回0 
	} else {
		temp=list;// 临时保存开始结点
		x=temp->data;// 保存要出栈结点的data值 
		list=temp->next;// 将出栈结点的下一个结点置为栈顶结点 
		free(temp);// 释放结点资源 
		return 1;// 出栈成功返回1
	}
}
 
/* 打印链栈 */
/* list指的是要被打印的链栈 */
void printStack(LNode  *list) {
	LNode *temp=list;
	printf("\n");
	while(temp!=NULL) {
		printf("%d\t",temp->data);
		temp=temp->next;
	}
	printf("\n");
}
 
int main() {
	LNode *list;
	int x;
	initStack(list);// 初始化栈
 
	/* 入栈 */
	push(list,1);// 将1入栈
	push(list,2);// 将2入栈
	push(list,3);// 将3入栈
	push(list,4);// 将4入栈
	push(list,5);// 将5入栈
	printStack(list);// 打印入栈成功的链栈
 
	/* 判断栈空 */
	printf("是否栈空(1表示栈空,0表示非空):%d\n",isEmpty(list));
 
	/* 出栈 */
	/* 第一次出栈 */
	pop(list,x);// 将栈顶元素出栈
	printf("出栈元素:%d",x);// 打印出栈的元素
	printStack(list);// 打印剩下的链栈元素
	/* 第二次出栈 */
	pop(list,x);// 将栈顶元素出栈
	printf("出栈元素:%d",x);// 打印出栈的元素
	printStack(list);// 打印剩下的链栈元素
	/* 第三次出栈 */
	pop(list,x);// 将栈顶元素出栈
	printf("出栈元素:%d",x);// 打印出栈的元素
	printStack(list);// 打印剩下的链栈元素
 
	return 0;
}

结果如下:

考研数据结构之栈(2.4)——练习题之用不带头结点的单链表来存储链栈实现操作(C表示)_第3张图片

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