栈的链式结构实现
2016-01-22 22:26
288 查看
/* 2 栈的链式结构实现 */ #include <stdio.h> #include <stdbool.h> #include <stdlib.h> typedef int TYPE;//元素类型别名 //声明顺序栈结构体 typedef struct stack { TYPE data;//存储结点数据 struct stack* next;//记录后继结点的地址 }stack; void init(stack**);//初始化 void push(stack**,TYPE);//入栈 TYPE pop(stack**);//出栈 void clear(stack**);//清空 bool isEmpty(stack*);//判断栈是否已满 int length(stack*);//返回栈的元素个数 void ergodic(stack*);//遍历栈中元素 int search(stack*,TYPE);//搜索,返回具栈顶首次出现位置 int main() { stack* top; init(&top); //入栈测试 int count=0;//记录入栈元素个数 printf("输入入栈元素个数:"); scanf("%d",&count); int elem;//记录单个入栈元素 printf("输入%d个元素:",count); while(count) { scanf("%d",&elem); push(&top,elem); count--; } //遍历测试 printf("遍历栈中元素:"); ergodic(top); scanf("%*[^\n]"); scanf("%*c"); //搜索测试 printf("输入要搜索的元素:"); scanf("%d",&elem); int pos =search(top,elem); if(pos) { printf("查找成功,%d在从栈顶开始第%d个元素\n",elem,pos); } else printf("查找失败!\n"); //栈长度测试 count = length(top); //栈清空测试 栈清空测试与出栈测试不能同时进行 //clear(&top); //出栈测试 printf("栈中有%d个元素\n",count); while(count--) printf("出栈元素是:%d\n",pop(&top)); //栈长度测试 printf("栈中有%d个元素\n",length(top)); return 0; } //栈初始化 //因为要更新栈顶指针本身的值,所以要用二级指针 void init(stack** ss) { *ss=NULL; } //入栈操作 //因为要更新栈顶指针本身的值,所以要用二级指针 void push(stack** ss,TYPE e) { stack* p=(stack*)malloc(sizeof(struct stack)); if(p) { p->data = e; p->next=*ss; *ss=p; } else printf("内存申请失败,缓冲区将清空!\n"); } //出栈操作 //因为要更新栈顶指针本身的值,所以用二级指针 TYPE pop(stack** ss) { if(!isEmpty(*ss))//栈不为空 { stack* q=*ss;//记录原来的栈顶指针 int data=q->data;//获取栈顶元素值 *ss=(*ss)->next;//更新栈顶指针 free(q);//销毁原来栈顶元素 q=NULL; return data; } } //判断是否为空 bool isEmpty(stack* s) { return s==NULL; } //返回栈的长度 int length(stack* s) { int count=0; while(s) { s = s->next; count++; } return count; } //遍历栈 void ergodic(stack* s) { while(s) { printf("%d ",s->data); s=s->next; } printf("\n"); } //搜索栈中元素 //返回元素距离栈顶的位置,如果有多个相同值,则返回首次出现的位置 int search(stack* s,TYPE e) { int pos=0; while(s) { if(s->data==e) { pos++; break;//找到就停止继续寻找 } pos++; s=s->next; } return pos; } //清空栈 //因为要更新栈顶指针本身的值,所以要用二级指针 void clear(stack** ss) { while(*ss) { stack* q=*ss; *ss = (*ss)->next; free(q); q=NULL; } }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C++基于栈实现铁轨问题
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法