单链表: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. ftp利用脚本添加本地用户

    指定用户名,家目录,密码,顺序不可颠倒.eg: sh 脚本名 用户名 家目录 密码 #!/bin/bash # set -e ] //判断给定参数是否为三个 homepath=$ password=$ ...

  2. IP地址等价类测试用例

    下面是一个比较完善的设计方案,这个方案中,首先把IP地址分成有效可用的IP地址和有效但不可用的IP地址两个等价类:其中有效可用的IP地址中包括IP地址的A,B,C三类地址,有效但不可用的IP地址包括D ...

  3. 【STM32】PWM DAC基本原理(实验:PWM实现DAC)

    虽然STM32F103ZET6具有内部DAC,但是也仅仅只有两条DAC通道,并且STM32还有其他的很多型号是没有DAC的.通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加. 不过S ...

  4. 使用zabbix监控mariadb性能状态

    0x01 前言 zabbix内置Mysql的监控模版,因为mariadb和Mysql两者的相关性,所以这个模版也能用在mariadb services上. 0x02 Mysql 首先要在mariadb ...

  5. 使用指针来实现变长数组(VLA)

    实现代码: #include <cstdio> #include <cstdlib> void usePtoImplementVLA(int SIZE) { scanf(&qu ...

  6. js jquery 遍历 for,while,each,map,grep

    js jquery 遍历 一,for循环. // 第一种var arr = [1, 2, 3];for(var i = 0; i < arr.length; i++) { console.log ...

  7. JS小积累(一)— 判断在线离线

    JS小积累-判断在线离线 作者: 狐狸家的鱼 Github: 八至 if(window.navigator.onLine==true){ console.log('online'); ... } el ...

  8. url加时间戳方法及作用

    速记:URL 的末尾追加了时间.这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发:此 URL 会由于时间戳的不同而稍微有些不同.这种技巧常被用于确保到脚本的 POS ...

  9. mongodb安装和运行

    转载来源:https://blog.csdn.net/IT_wanghe/article/details/53884229 参考教程:http://www.runoob.com/mongodb/mon ...

  10. webDriver文档阅读笔记

    一些雷 浏览器版本和对应的Driver的版本是一一对应的,有时候跑不起来,主要是因为driver和浏览器版本对不上. e.g: chrome和driver版本映射表:https://blog.csdn ...