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

Posted ly570

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);


以上是关于C语言数据结构链栈(创建入栈出栈取栈顶元素遍历链栈中的元素)的主要内容,如果未能解决你的问题,请参考以下文章

如何理解“入栈、读栈、出栈”

C语言链栈及基本操作(包含入栈和出栈)保姆级详解

C语言链栈及基本操作(包含入栈和出栈)保姆级详解

C 数据结构之栈和队列

如何用函数实现入栈和出栈

第三章学习小结