链栈带头结点

栈的链式存储结构

采用链式存储的栈称为链栈,所有操作都是在单链表的头部进行

带头结点的链栈实现

//栈的链式存储类型可描述为
//这里有两种方法
typedef struct Linknode
{
  ElemType data;         //数据域
  struct Linknode *next  //指针域
}*LiStack;               //栈类型的定义
表示用它声明的数据,就是一个指针,比如LiStack a,a就是一个指针,要访问a的数据要用a->data的方式访问。
LiStack声明的变量是指针
typedef int ElemType;
struct Node {             //单链表节点定义
	ElemType data;        //数据域
	struct Node* next;    //指针域
};
struct LinkStack {        //链栈类型定义
	struct Node* top;
};
typedef struct LinkStack* PLinkStack; //链栈类型的指针类型

带头结点的链栈定义

LinkStack CreateLinkStack(void)
{
  LNode *s;int x;//定义指针
  L=(LinkStack)malloc(sizeof(LNode));//创建头结点
  if(L==NULL) //结点申请失败,返回空指针
  {
     return NULL;
  }
  L->top=NULL;//申请成功,栈顶指针为空
  return L;   //返回空链栈
}

链栈的判空操作

bool EmptyLinkStack(PLinkStack plstack)
{
	return (L->top == NULL); //判断栈顶指针是否为空
}

链栈的判空操作
不用担心上溢这个问题

bool Push(PLinkStack plstack, ElemType e)
{
	struct Node* p = (struct Node*)malloc(sizeof(struct Node));
	if (p == NULL)             //申请新节点空间失败
	{
		return false;
	}
	//不用判断栈是否已满
	p->data = e;
	p->next = L->top;   //新节点连接到链栈栈顶指针之后,
	L->top = p;         //链栈栈顶指针指向新增节点
	return true;
}

链栈的出栈操作
入栈不需要判空,出栈需要判空
栈不空时,先用e存储栈顶元素,再让栈顶指针指向栈中的第二个结点,最后释放第一个结点的内存空间。

bool Pop(PLinkStack plstack, ElemType* e)
{
	struct Node* p;
	if (L->top == NULL)  //链栈为空,报错
	{
		return false;
	}
	*e = L->top->data;  //e记录出栈的元素
	p = L->top;         //p指向第一个节点
	L->top = p->next;   //栈顶指针指向第二个接点
	free(p);                  //释放出栈节点的内存空间
	return true;
}

为什么是p->next是指向第二个结点

取链栈的栈顶元素

bool GetTopElem(PLinkStack plstack, ElemType* e)
{
	if (L->top == NULL)  //链栈为空,报错
	{
		return false;
	}
	*e = L->top->data;   //e记录栈顶的元素
	return true;
}

参考

链接: link.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
带头点的链具体操作如下: 1. 初始化链:创建一个头点,并将头点的next指针指向NULL。 2. 入操作:在头点后插入一个新节点,将新节点的数据域设置为要插入的元素,将新节点的next指针指向原来的第一个节点,然后将头点的next指针指向新节点。 3. 出操作:将头点的next指针指向的节点删除,并返回该节点的数据域作为出的元素。 4. 判断空:判断头点的next指针是否为NULL,如果是则空,否则非空。 5. 销毁链:从头点的next指针开始,依次释放每个节点的内存空间,最后释放头点的内存空间。 不带头点的链具体操作如下: 1. 初始化链:将链设置为NULL。 2. 入操作:如果链为空,特殊处理,创建一个新节点,并将新节点的数据域设置为要插入的元素,将新节点的next指针指向NULL,然后将链指向新节点;如果链不为空,创建一个新节点,并将新节点的数据域设置为链的数据域,将链的数据域设置为要插入的元素,将新节点的next指针指向链的next指针,然后将链的next指针指向新节点。 3. 出操作:将链指向的节点删除,并返回该节点的数据域作为出的元素。 4. 判断空:判断链是否为NULL,如果是则空,否则非空。 5. 销毁链:从链开始,依次释放每个节点的内存空间。 #### 引用[.reference_title] - *1* *2* *3* [使用C语言实现链带头点和不带头点)](https://blog.csdn.net/Keep_Trying_Go/article/details/126284714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值