/*
*创建链栈
*创建一个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);
}

}
}

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

  1. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

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

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

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

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  4. C语言数据结构-链式栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作

    1.数据结构-链式栈的实现-C语言 //链式栈的链式结构 typedef struct StackNode { int data; struct StackNode *next; } StackNod ...

  5. C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作

    1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...

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

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

  7. C语言实现链栈以及基本操作

    链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...

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

    三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性 ...

  9. C语言数据结构----栈与递归

    本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...

随机推荐

  1. webservice Connection timed out

    webservice Connection timed out,当发生webservice的链接超时错误时.我想原因无非就是webclient到webservice之间的链接通路发生了异常,那么该怎样 ...

  2. Unity3D 怎样在安卓手机上播放视频

    曾经仅仅会在电脑上通过Unity3D播放视频,研究了下发现通过Unity3D在手机上播放视频也很easy.现介绍例如以下. void OnGUI()     {         if (GUI.But ...

  3. unity3d-23种设计模式全解析

    http://www.jianshu.com/nb/4161593 2016.08.03 09:26 字数 1203 阅读 584评论 0喜欢 14 希望大家能共同学习,交流 谢谢支持zero(QQ: ...

  4. [BZOJ 1691] 挑剔的美食家

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1691 [算法] 不难想到如下算法 : 将所有牛和牧草按鲜嫩程度降序排序,按顺序扫描, ...

  5. P2120 [ZJOI2007]仓库建设 斜率优化dp

    好题,这题是我理解的第一道斜率优化dp,自然要写一发题解.首先我们要写出普通的表达式,然后先用前缀和优化.然后呢?我们观察发现,x[i]是递增,而我们发现的斜率也是需要是递增的,然后就维护一个单调递增 ...

  6. 杂项-QXM:CFA(特许金融分析师)

    ylbtech-杂项-QXM:CFA(特许金融分析师) 1.返回顶部 1. CFA是“特许金融分析师”(Chartered Financial Analyst)的简称,它是证券投资与管理界的一种职业资 ...

  7. 创建APP检查更新页

    本文来源及参考:Create a check for updates page for your app. 这篇文章解释了如何创建一个简单的检查更新页,检查该用户已安装的应用程序的最新版本. 简介 这 ...

  8. activiti安装-------安装插件

    对上面的放大

  9. [Swift通天遁地]六、智能布局-(5)给视图添加Align(对齐)和Fill(填充的约束以及Label的约束

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. async 函数-----------------解决异步操作隧道的亮光

    之前也学过,只是没有学好,公司现在用的都是async函数 , 所以决定把它弄懂.最近看了看阮一峰的博客,做下记录. 异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用 ...