Linux与数据结构 2019-3-9 下午

本文详细介绍了如何判断单链表是否具有线性结构,以及确定环状结构入口点的两种方法。同时,深入探讨了栈的基本概念,列举了栈的8个核心函数,并提供了C语言实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.线性表

1.1 确定单链表是否有线性结构的方法只能进行是否有环状结构,无法确定入口点在哪里,确定入口点的方法

1.将该单链表转换为 Y型链表 ,这样即可按照 Y型链表 的方法来确定入口点;
2.获得环的长度k,再通过两个指针间隔k个来寻找入口点;

// ============================================代码未完成============================================

2.栈和队列

2.1 栈也可称为 FILO

2.2 网页中的后退键就用到了 栈 的思想

2.3 关于栈有8个基本函数

1.push
2.pop
3.init
4.clear
5.gettop
6.getcount
7.isempty
8.destroy

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int nValue;
	struct node *pNext;
}Node;

typedef struct stack
{
	Node *pTop;
	int nCount;
}Stack;

void s_Init(Stack **pStack)
{
	*pStack = (Stack*)malloc(sizeof(Stack));
	(*pStack)->pTop = NULL;
	(*pStack)->nCount = 0;
}

void s_Push(Stack *pStack,int nNum)
{
	if(pStack == NULL)
	{
		printf("栈不存在\n");
		return;
	}

	Node *pTemp = NULL;
	pTemp = (Node*)malloc(sizeof(Node));
	pTemp->nValue = nNum;
	pTemp->pNext = pStack->pTop;
	pStack->pTop = pTemp;
	pStack->nCount++;
}

int s_Pop(Stack *pStack)
{
	if(pStack == NULL || pStack->nCount == 0)
	{
		printf("错误\n");
		return -1;
	}

	int nNum;
	Node *pDel = NULL;
	pDel = pStack->pTop;
	nNum = pDel->nValue;

	pStack->pTop = pStack->pTop->pNext;
	
	free(pDel);
	pDel = NULL;

	pStack->nCount--;
	return nNum;
}

void s_Clear(Stack *pStack)
{
	if(pStack == NULL)return;

	while(pStack->nCount != 0)
	{
		s_Pop(pStack);
	}
}

void s_Destroy(Stack **pStack)
{
	s_Clear(*pStack);

	free(*pStack);
	*pStack = NULL;
}

Node *s_GetTop(Stack *pStack)
{
	if(pStack == NULL)exit(1);

	return pStack->pTop;
}

int s_GetCount(Stack *pStack)
{
	if(pStack == NULL)exit(1);

	return pStack->nCount;
}

int s_IsEmpty(Stack *pStack)
{
	if(pStack == NULL)exit(1);

	return pStack->nCount == 0 ?1:0;
}


int main()
{
	Stack *pStack = NULL;
	
	s_Init(&pStack);
	s_Push(pStack,1);
	s_Push(pStack,2);
	s_Push(pStack,3);
	s_Push(pStack,4);

	printf("%d\n",s_Pop(pStack));
	printf("%d\n",s_Pop(pStack));
	printf("%d\n",s_Pop(pStack));
	printf("%d\n",s_Pop(pStack));
	
	s_Destroy(&pStack);
	s_Push(pStack,100);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值