45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:实现数据结构C语言系列方法

实现数据结构C语言系列方法

2016-09-05 04:42:49 来源:www.45fan.com 【

实现数据结构C语言系列方法

 

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

typedefintelemType;
/************************************************************************/
/*以下是关于栈顺序存储操作的6种算法 */
/************************************************************************/
structstack{
elemType
*stack;/*存储栈元素的数组指针*/
inttop;/*存储栈顶元素的下标位置*/
intmaxSize;/*存储stack数组的长度*/
};

voidagainMalloc(structstack*s)
{

/*空间扩展为原来的2倍,原内容被自动拷贝到p所指向的存储空间中*/
elemType*p;
p
=realloc(s->stack,2*s->maxSize*sizeof(elemType));
if(!p){
printf(
"内在分配失败! ");
exit(
1);
}
s
->stack=p;/*使stack指向新的栈空间*/
s->maxSize=2*s->maxSize;/*把栈空间的大小修改新的长度*/
return;
}


/*1.初始化栈s为空*/
voidinitStack(structstack*s,intms)
{

if(ms<=0){
printf(
"ms的值非法! ");
exit(
1);
}
s
->maxSize=ms;
s
->stack=malloc(ms*(sizeof(elemType)));
if(!s->stack){
printf(
"内在分配失败! ");
exit(
1);
}
s
->top=-1;/*初始置栈为空*/
return;
}


/*2.新元素进栈,即把它插入到栈顶*/
voidpush(structstack*s,elemTypex)
{

/*若栈空间用尽则重新分配更大的存储空间*/
if(s->top==s->maxSize-1){
againMalloc(s);
}
s
->top++;/*栈顶指针后移一个位置*/
s->stack[s->top]=x;/*将新元素插入到栈顶*/
return;
}


/*3.删除(弹出)栈顶元素并返回其值*/
elemTypepop(structstack*s)
{

/*若栈空则退出运行*/
if(s->top==-1){
printf(
"栈空,无元素出栈! ");
exit(
1);
}
s
->top--;/*栈顶指针减1表示出栈*/
returns->stack[s->top+1];/*返回原栈顶元素的值*/
}

/*4.读取栈顶元素的值*/
elemTypepeek(structstack*s)
{

/*若栈空则退出运行*/
if(s->top==-1){
printf(
"栈空,无元素可读取! ");
exit(
1);
}

returns->stack[s->top];/*返回原栈顶元素的值*/
}

/*5.判断s是否为空,若是则返回1表示真,否则返回0表示假*/
intemptyStack(structstack*s)
{

if(s->top==-1){
return1;
}
else{
return0;
}
}


/*6.清除栈s中的所有元素,释放动态存储空间*/
voidclearStack(structstack*s)
{

if(s->stack){
free(s
->stack);
s
->stack=NULL;
s
->top=-1;
s
->maxSize=0;
}

return;
}


/************************************************************************/

intmain()
{

structstacks;
inta[8]={3,8,5,17,9,30,15,22};
inti;
initStack(
&s,5);
for(i=0;i<8;i++){
push(
&s,a[i]);
}
printf(
"%d",pop(&s));printf("%d ",pop(&s));
push(
&s,68);
printf(
"%d",peek(&s));printf("%d ",pop(&s));
while(!emptyStack(&s)){
printf(
"%d",pop(&s));
}
printf(
" ");
clearStack(
&s);
system(
"pause");
return0;
}
/************************************************************************/
/*以下是关于栈链接存储操作的6种算法*/
/************************************************************************/

structsNode{
elemTypedata;

structsNode*next;
};


/*1.初始化链栈为空*/
voidinitStack(structsNode**hs)
{

*hs=NULL;
return;
}


/*2.向链中插入一个元素(入栈)*/
voidpush(structsNode**hs,elemTypex)
{

structsNode*newP;
newP
=malloc(sizeof(structsNode));
if(newP==NULL){
printf(
"内在空间分配失败! ");
exit(
1);
}
newP
->data=x;/*给新分配的结点赋值*/
/*向栈顶插入新结点*/
newP->next=*hs;
*hs=newP;
return;
}


/*3.从链栈中删除一个元素并返回它(出栈)*/
elemTypepop(structsNode**hs)
{

structsNode*p;
elemTypetemp;

if(*hs==NULL){
printf(
"栈空无法删除! ");
exit(
1);
}

/*暂存栈顶结点指针,并使栈顶指针指向下一个结点*/
p=*hs;
*hs=p->next;
/*暂存原栈顶元素以便返回,同时回收原栈顶结点*/
temp=p->data;
free(p);

returntemp;/*返回原栈顶元素*/
}

/*4.读取栈顶元素*/
elemTypepeek(structsNode**hs)
{

/*对于空栈则退出运行*/
if(*hs==NULL){
printf(
"栈空,无栈顶元素! ");
exit(
1);
}

return(*hs)->data;/*返回栈顶结点的值*/
}

/*5.判断链栈是否为空,为空返回1,否则返回0*/
intemptyStack(structsNode**hs)
{

if(*hs==NULL){
return1;
}
else{
return0;
}
}


/*6.清除链栈为空*/
voidclearStack(structsNode**hs)
{

structsNode*cp,*np;
cp
=*hs;/*使cp指向栈顶结点*/
/*从栈底依次删除每个结点*/
while(cp!=NULL){
np
=cp->next;
free(cp);
cp
=np;
}

*hs=NULL;/*置链栈为空*/
return;
}


/************************************************************************/
 

本文地址:http://www.45fan.com/dnjc/72427.html
Tags: 实现 语言 数据结构
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部