单链表: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. 【转】设置 vim 显示行号永久有效

    在linux环境下,vim是常用的代码查看和编辑工具.在程序编译出错时,一般会提示出错的行号,但是用vim打开的代码确不显示行号,错误语句的定位非常不便.那么怎样才能让vim显示代码的行号呢? 1 临 ...

  2. 觉得一篇讲SPFA还不错的文章

    我觉得他整理的有一些乱,我都改成插入代码了,看的顺眼一些 转载自http://blog.csdn.net/juststeps/article/details/8772755 下面的都是原文: 最短路径 ...

  3. python 获取当前文件夹下所有文件名

    os 模块下有两个函数: os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os 4 5 def file_name(file_d ...

  4. 分页技术 -servlet

    一.思路: 定义四个分页变量. pagenow 表示第几页,该变量由用户决定的,是变化的. pageSize 每页显示几条记录,由程序定义,也可以由程序定制. pageCount 表示共有多少页,(该 ...

  5. Spring -- 自定义转换器

    Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中: Converter<S,T> ...

  6. [Splay][学习笔记]

    胡扯 因为先学习的treap,而splay与treap中有许多共性,所以会有很多地方不会讲的很细致.关于treap和平衡树可以参考这篇博客 关于splay splay,又叫伸展树,是一种二叉排序树,它 ...

  7. Cannot read property 'properties' of undefined

    今天运行一个很有意思的项目,报上面的错 根据报错,可以发现,报错出现在项目文件夹下的node_modules\webpack-cli\bin\config-yargs.js文件第89行. 当前webp ...

  8. pthread_create()

    pthread_create()创建的线程没有执行,试了好几遍.非常郁闷.后来发现主线程没有睡眠,新创建的线程还没来的及执行主线程就退出了,所以没有执行.

  9. Linux系统调用之内存管理

    brk 改变数据段空间的分配 sbrk 参见brk mlock 内存页面加锁 munlock 内存页面解锁 mlockall 调用进程所有内存页面加锁 munlockall 调用进程所有内存页面解锁 ...

  10. 第七节,TensorFlow编程基础案例-TensorBoard以及常用函数、共享变量、图操作(下)

    这一节主要来介绍TesorFlow的可视化工具TensorBoard,以及TensorFlow基础类型定义.函数操作,后面又介绍到了共享变量和图操作. 一 TesnorBoard可视化操作 Tenso ...