单链表:linkList.h linkList.c

 #ifndef LINKLIST_H_INCLUDE
#define LINKLIST_H_INCLUDE
#include <Windows.h> //什么是链表 是一种动态数组 管理一堆不断变化的元素 typedef struct e{
void *data;//元素通过一个万能的指针指向代表的数据
struct e *next;//指向下一个元素
}E, *PE; //单链表 对象属性:一个元素句柄 元素个数
typedef struct linkList{
PE handler;//元素的句柄
int count;//元素的总数
}LinkList, *PLinkList; //以下是接口 //实例化一个元素 最常用的构造方法:直接指定数据
PE newE(void *);
//实例化一个空链表
PLinkList newLinkList();
//查
PE LinkList_get(PLinkList, int);
//删
BOOL LinkList_del(PLinkList, int);
//改
BOOL LinkList_set(PLinkList, int, PE);
//增
BOOL LinkList_add(PLinkList, int, PE);
//叛空
BOOL LinikList_isEmpty(PLinkList);
//取数量
int LinkList_getCount(PLinkList); #endif

linkList.h

 #include "linkList.h"
#include <stdlib.h>
#include <assert.h> //实例化一个元素 最常用的构造方法:直接指定数据
PE newE(void *data){
PE r = NULL;
r = (PE) malloc(sizeof(E));
r->data = data;
r->next = NULL;
return r;
}
//实例化一个空链表
PLinkList newLinkList(){
PLinkList r = NULL;
r = (PLinkList) malloc(sizeof(LinkList));
r->count = ;
r->handler = newE(NULL);
return r;
}
//查
PE LinkList_get(PLinkList list, int id){//id:[0,n]
int i = ;
PE e = NULL;
assert(list!=NULL);
assert(id>=&&id<=list->count);
e = list->handler;
for(i=;i<=id;i++){
e = e->next;
}
return e;
}
//删
BOOL LinkList_del(PLinkList list, int id){//id[1,n]
//assert(list);
//assert(id>=1&&id<=list->count);
if(!list|| id<|| id>list->count) return FALSE;
//id-1->next=id->next
LinkList_get(list, id-)->next = LinkList_get(list, id)->next;
list->count--;
return TRUE;
}
//改
BOOL LinkList_set(PLinkList list, int id, PE e){//id:[1,n]
if(!list|| !e|| id<|| id>list->count) return FALSE;
e->next = LinkList_get(list, id)->next;
LinkList_get(list, id-)->next = e;
return TRUE;
}
//增
BOOL LinkList_add(PLinkList list, int id, PE e){//id:[1,n+1]=>[1,~)
assert(list&&e);
if(id>list->count+)
id = list->count+;
assert(id>=&&id<=list->count+);
//e连接id-1->next,id-1连接e
e->next = LinkList_get(list, id-)->next;
LinkList_get(list, id-)->next = e;
list->count++;
return TRUE;
}
//叛空
BOOL LinikList_isEmpty(PLinkList list){
assert(list);
if(list->count==)
return TRUE;
return FALSE;
}
//取数量
int LinkList_getCount(PLinkList list){
assert(list);
return list->count;
}

linkList.c

栈:stack.h stack.c

 #ifndef STACK_H_INCLUDE
#define STACK_H_INCLUDE
#include <Windows.h>
#include "linkList.h"
/**
*对象:栈
*属性:链表指针 栈帧
*接口:实例化 入栈 弹栈 取栈顶元素 叛空 取元素数量
*/
typedef struct stack{
PLinkList list;//链表
int top;//栈顶
}Stack, *PStack; //以下为接口 PStack newStack();//实例化一个空栈
BOOL Stack_push(PStack, void*);//入栈
void *Stack_pop(PStack);//弹栈
void *Stack_getTop(PStack);//取栈顶元素但不弹出 相当于将该元素弹栈使用后又入栈
BOOL Stack_isEmpty(PStack);//叛空
int Stack_getCount(PStack);//取栈剩余元素数量 #endif

stack.h

 #include "stack.h"
#include "linkList.h"
#include <assert.h>
#include <stdlib.h> //实例化一个空栈
PStack newStack(){
PStack r = NULL;
r = (PStack) malloc(sizeof(Stack));
r->top = ;
r->list = newLinkList();
return r;
}
//入栈
BOOL Stack_push(PStack stack, void* data){
assert(stack);
//创建一个新元素, 添加到表头(方便弹栈)
if(LinkList_add(stack->list, , newE(data)) ){
stack->top++;
return TRUE;
}
return FALSE;
}
//弹栈
void *Stack_pop(PStack stack){
assert(stack);
if(stack->top>&&stack->list->count>){
PE e = LinkList_get(stack->list, );
if(e){
stack->top--;;
LinkList_del(stack->list, );
return e->data;
}
}
return NULL;
}
void *Stack_getTop(PStack stack){
PE e = NULL;
assert(stack);
if(stack->top> && stack->list->count> ){
e = LinkList_get(stack->list, );
}
return e? e->data: NULL;
}
//叛空
BOOL Stack_isEmpty(PStack stack){
return !stack->top;
}
//取栈剩余元素数量
int Stack_getCount(PStack stack){
assert(stack);
return stack->top;
}

stack.c

C语言 - 栈和单链表的实现的更多相关文章

  1. python中栈的单链表实现

    参考博客:https://www.cnblogs.com/stacklike/p/8284550.html 基于列表的简单实现 # 先进后出 # 以列表实现的简单栈 class SimpleStack ...

  2. Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序

    直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:

  3. C语言实现的单链表

    链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来. 单链表的基本实现: typedef int DataType;//定义单链表typedef ...

  4. C语言版本:单链表的实现(优化版本)

    未优化版本:http://www.cnblogs.com/duwenxing/p/7569376.html slist.h #ifndef __SLIST_H__ #define __SLIST_H_ ...

  5. C语言版本:单链表的实现

    slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...

  6. C语言学习016:单链表

    #include <stdio.h> //定义一个链表,链表是一种递归结构,在定义的时候必须要给结构起一个名字 typedef struct folder{ int level; char ...

  7. Javascript - 栈 和 单链表

    最近在重温数据结构,于是写了一些代码玩玩,都是很初级的,表喷各位.... function Stack() { this.dataStore = []; this.top = 0; } Stack.p ...

  8. c语言实现循环单链表

    //初始化 Node*InitList() { Node*head=(Node*)malloc(sizeof(Node)); head->next=NULL; head->data=-1; ...

  9. C语言实现单链表(带头节点)

    C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node ...

随机推荐

  1. [HEOI2016/TJOI2016]游戏 解题报告

    [HEOI2016/TJOI2016]游戏 看起来就是个二分图匹配啊 最大化匹配是在最大化边数,那么一条边就代表选中一个坐标内的点 但是每一行不一定只会有一个匹配 于是把点拆开,按照'#'划分一下就好 ...

  2. NOI 2002 贪吃的九头龙

    树形dp #include<bits/stdc++.h> #define N 305 using namespace std; struct LEB{ int to,nxt,w; }e[N ...

  3. python3+django2 开发易语言网络验证(下)

    第六步:网络验证服务器端项目上线部署 功夫不负有心人,终于部署成功啦! 前期准备: 项目名:netauth 系统:百度云服务器下的Ubuntu16.4 软件:xshell(无论如何想办法用这个跟服务器 ...

  4. django 通过ajax完成邮箱用户注册、激活账号

    一.图片验证码 django-simple-captcha配置 1.在pycharm中,File====>Settings====>Project:项目名====>Project I ...

  5. JAVA概述 也许你会豁然开朗

    1.JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2.JRE:Java Runtime Environment,java程序的运行环境,ja ...

  6. 在windows中把一个文件夹打成war包

    转: 在windows中把一个文件夹打成war包 一般开发打war包时都是用MyEclipse或IntelliJ IDEA等直接导出war文件,这里介绍一种如何把一个文件夹打成war包的方式,如下   ...

  7. Luogu P3181 [HAOI2016]找相同字符 广义$SAM$

    题目链接 \(Click\) \(Here\) 设一个串\(s\)在\(A\)中出现\(cnt[s][1]\)次,在\(B\)中出现\(cnt[s][2]\)次,我们要求的就是: \[\sum cnt ...

  8. Go语言反射规则

    Go语言反射规则 - The Laws of Reflection 转:http://my.oschina.net/qbit/blog/213720 原文地址:http://blog.golang.o ...

  9. Python三十个常见的脚本汇总

    1.冒泡排序     2.计算x的n次方的方法     这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发.爬虫.数据分析.数据可视化.机器学习等.送给正在 ...

  10. 10款 Mac 经典原型设计开发软件推荐

    在Mac上有大量强大的开发和设计工具,今天和大家推荐10款Mac上的经典原型设计开发工具,原型设计工具是开发者必备的一款工具,无论是网站开发还是移动APP开发,都需要在前期进行严格细致的原型设计,才能 ...