C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

/*
*创建链栈
*创建一个top指针代表head指针
*采用链式存储结构
*采用头插法创建链表
*操作 创建 出栈 入栈 取栈顶元素
*创建数据域的结构体
*创建数据域的名称指针
*使用随机函数对数据域的编号进行赋值
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define NAMESIZE 255//字符串的最大长度
int count=0;//链栈中数据元素的个数
typedef int IdType;//数据域的数据类型
typedef char *NameType;//数据域名称的数据类型
typedef int Statu;//函数返回值的数据类型
typedef struct elementtype
{
IdType id;
NameType name;//数据域的名称的指针
}ElementType;
typedef struct linkstack
{
ElementType *data;//数据域指针
struct linkstack *next;//指向下一个节点的指针

}Link_Stack;//链栈的结构体
Statu create_linkstack(Link_Stack *top);//链栈的创建
void Init_linkstack(Link_Stack *top);//链栈的初始化
Statu push_linkstack(Link_Stack *top,ElementType key);//入栈
Statu pop_linkstack(Link_Stack *top,ElementType *key);//出栈
Statu getdata_linkstack(Link_Stack*top,ElementType *data);//取栈顶元素
Statu empty_linkstack(Link_Stack*top);//判断栈是否为空
void Display_linkstack(Link_Stack *top);//遍历栈中的数据
void main()
{
Link_Stack *top;
ElementType data;//入栈的数据
ElementType data1;//出栈的元素
ElementType key;//取栈顶元素
top=(Link_Stack*)malloc(sizeof(Link_Stack));
//对链栈进行初始化
Init_linkstack(top);
int result=create_linkstack(top);
if(result==ERROR)
{
printf("链栈创建失败\n");
}
else
{
printf("链栈创建成功\n");
printf("链栈中数据元素的个数为:%d\n",count);

}
if(empty_linkstack(top))
printf("链栈为空\n");
else
printf("链栈不为空\n");
data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
data.id=rand()%50;
printf("请输入入栈的数据的名称:");
scanf("%s",data.name);
int result1=push_linkstack(top,data);
if(result1==ERROR)
printf("入栈失败\n");
else
printf("入栈成功\n");
data1.name=(NameType)malloc(sizeof(char)*NAMESIZE);
int result2=pop_linkstack(top,&data1);
if(result2==ERROR)
{
printf("出栈失败\n");
}
else
{
printf("出栈成功\n");
printf("出栈的元素为[%s,%d]\n",data1.name,data1.id);
}
key.name=(NameType)malloc(sizeof(char)*NAMESIZE);
int result3=getdata_linkstack(top,&key);
if(result3==ERROR)
printf("取栈顶元素失败\n");
else
{
printf("取栈顶元素成功\n");
printf(" 栈顶元素为:[%s,%d]\n",key.name,key.id);
}
printf("栈中数据遍历的结果为\n");
Display_linkstack(top);
}
void Init_linkstack(Link_Stack*top)//链栈的初始化
{
if(top==NULL)
{
printf("链栈初始化失败\n");
return ;
}
else
{
top->next=NULL;
}
}
Statu create_linkstack(Link_Stack *top)//链栈的创建
{
if(top==NULL)
return ERROR;
Link_Stack *s;
char name[NAMESIZE];
s=(Link_Stack*)malloc(sizeof(Link_Stack));
if(s==NULL)
return NULL;
printf("请输入数据域的名称:\n");
while(scanf("%s",name)!=EOF)
{
if(strcmp(name,"^")==0)
break;
else if(s==NULL)
break;
else
{

s->data=(ElementType*)malloc(sizeof(ElementType));
s->data->name=(NameType)malloc(sizeof(char)*NAMESIZE);
strcpy(s->data->name,name);
s->data->id=rand()%30;//data为数据域指针 所以全部使用箭头指向
s->next=top->next;
top->next=s;
count++;//数据元素++
}
s=(Link_Stack*)malloc(sizeof(Link_Stack));
}
return OK;
}
Statu empty_linkstack(Link_Stack*top)//判断栈是否为空
{
if(top->next==NULL)
{
return OK;
}
else
{
return ERROR;
}
}
Statu push_linkstack(Link_Stack *top,ElementType key)//入栈
{
if(top==NULL)
return ERROR;
Link_Stack *s;
s=(Link_Stack*)malloc(sizeof(Link_Stack));
s->data=(ElementType*)malloc(sizeof(ElementType));
s->data->name=(NameType)malloc(sizeof(char)*NAMESIZE);
s->data->id=key.id;
strcpy(s->data->name,key.name);
s->next=top->next;
top->next=s;
return OK;

}
Statu pop_linkstack(Link_Stack *top,ElementType *key)//出栈
{
Link_Stack*node;
if(empty_linkstack(top))
{
return ERROR;
}
else
{
node=top->next;
key->id=node->data->id;
strcpy(key->name,node->data->name);
top->next=node->next;
free(node);//释放其内存
}
}
Statu getdata_linkstack(Link_Stack*top,ElementType *data)//取栈顶元素
{
//取栈顶元素
if(empty_linkstack(top))
return ERROR;
else
{
Link_Stack*node;
node=top->next;
data->id=node->data->id;
strcpy(data->name,node->data->name);
return OK;

}
}
void Display_linkstack(Link_Stack *top)//遍历栈中的数据
{
ElementType data;//出栈的数据

//对栈进行判断是否为空
if(empty_linkstack(top))
return ;
else
{ while(empty_linkstack(top)!=1)
{
data.name=(NameType)malloc(sizeof(char)*NAMESIZE);
if(pop_linkstack(top,&data))
printf("[%s,%d]\t",data.name,data.id);
}

}
}

原文地址:https://www.cnblogs.com/ly570/p/11069914.html

时间: 2024-10-27 07:06:10

C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)的相关文章

浅入深出之Java集合框架(下)

Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. 温馨提醒:建议从(上)开始看哦~ 目 录 浅入深出之Java集合框架(上) 浅入深出之Java集合框架(中)   浅入深出之Java集合框架(下) 前 言 在<浅入深出之Java集合框架(中) >中介绍了Map接口的基本操作.使用的示例是在<浅入深出之Java集合框架(上)>中的模拟学

浅入深出之Java集合框架(中)

Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架(下)>. 目 录 浅入深出之Java集合框架(上) 浅入深出之Java集合框架(中)   浅入深出之Java集合框架(下) 努力赶制中..关注后更新会提醒哦! 前 言 在<浅入深出之Java集合框架(上)>中介绍了List接口和Set接口的基本操作,在这篇文章中,我将介绍关于Map接口的基

08.18 javascript 06 数组 数组的概念 创建数组 读取数组中的元素 稀疏数组 添加和删除数组的元素 数组遍历 多维数组 数组的方法 类数组对象 作为数组的字符串

# 数组 ### 数组的概念 * 数组是值的有序集合 * 数组中的每个值 称之为 元素 * 每个元素可以是任意数据类型的值 * 每个元素都有索引(下标) * 元素的索引从0开始,按照顺序递增. 元素最大的索引 2^32-2 ### 创建数组 * 直接量 `[]` * 构造函方式  `new Array()` ### 读写数组中的元素 * 数组名[索引] ### 稀疏数组 * js数组的索引是连续的 * 没有连续的给元素赋值 , 没有赋值的元素会自动赋值 undefined ### 添加和删除 数

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

C语言数据结构——第三章 栈和队列

三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性的数据结构. 从数据类型的角度看,它们是和线性表大不相同的两种重要的抽象数据类型,在面向对象的程序设计中,它们是多型数据类型. 3.1-栈 3.1.1-抽象数据类型栈的定义 栈:是限定仅在表尾进行插入或删除操作的线性表,又可以称为后进先出的线性表. 栈顶:栈的表尾端 栈底:栈的表头端 空栈:不含元素

c语言数据结构之栈的基本操作

栈是限定仅在表尾进行插入或者删除操作的线性表.各位也可以到360云盘中下载完整程序,运行环境为vc++6.0 http://yunpan.cn/cVKkv9fmsp4wB  访问密码 b737 1 typedef struct 2 { 3 SelemType *base; 4 SelemType *top; 5 int stacksize; 6 }SqStack; 现在来介绍下栈的操作实现. /***************************************************

数据结构 --- 链栈(栈的链式存储结构)

工程目录结构: common.h: 1 //#ifndef __common_h__ 2 //#define __common_h__ 3 4 #define OK 1 5 #define ERROR 0 6 #define TRUE 1 7 #define FALSE 0 8 9 #define MAXSIZE 20 10 11 typedef int Status; //函数的返回结果,OK.ERREO.TRUE.FALSE 12 typedef int ElemType; //结点数据域的

C语言强化(二)设计可以求最小元素的栈

上一篇详解了二叉树转双向链表,此篇作为[C语言强化]系列第二篇,来聊聊有关栈的一道题, 通过这道题,你可以掌握 如何使用栈"先进后出"的特性 如何巧妙地借助辅助栈 如何在结构体中定义可共享的静态成员变量 题目 看似很简单的求最小值函数,思路有很多很多.笔者首先想到每次push入栈都进行一次排序,使这个栈的栈顶永远是最小元素,然后就发现这是一个很蠢很蠢的想法,第一这样做会改变了栈的结构,第二不满足题目对时间复杂度的要求. 愚蠢归愚蠢,还是有点用的.既然不能改变原来栈的结构,那为何不弄俩栈