单链表: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. BM算法

    BM算法 用来求解一个数列的递推式. 即给定\(\{x_i\}\)求解一个\(\{a_i\}\),满足\(|a|=m,x_n=\sum_{i=1}^ma_i*x_{n-i}\). 考虑增量法构造. 假 ...

  2. 解决SSH连接出现 Software caused connection abort 的问题

    修改服务器中/etc/ssh/sshd.config 文件,将LoginGraceTime的值设为0,默认为2m,TCPKeepAlive 设为yes, 然后使用service sshd restar ...

  3. luogu5022 [NOIp2018]旅行 (dfs)

    m=n-1的时候,就直接贪心地dfs就可以 m=n的话,就可以枚举删掉一条边,然后照着m=n-1做 $O(n^2)$大概能过 (然而我眼瞎看不到m<=n) #include<cstdio& ...

  4. 洛谷 P5020 【货币系统】

    谁说这一定要排序的,这就是个装满背包嘛 \({f[i]}\) 表示 \(i\) 面值最多能被几张钱表示 则若其不能被表示 \(f[i]=-inf\) 能表示且只有它自己则 \(f[i]=1\) 初始化 ...

  5. CF1131F Asya And Kittens(Kruskal重构树,启发式合并)

    这题难度1700,我感觉又小了…… 这题虽然没几个人是用kruskal重构树的思想做的,但是我是,所以我就放了个kruskal重构树的标签. 题目链接:CF原网 题目大意:有一个长为 $n$ 的排列, ...

  6. js定时器setInterval()与setTimeout()

    js定时器setInterval()与setTimeout() 1.setTimeout(Expression,DelayTime),在DelayTime过后,将执行一次Expression,setT ...

  7. GNOME下让QT应用使用adwaita主题统一外观

    效果展示 使用前 使用后 步骤 Arch Linux下使用AUR安装 sudo yaourt adwaita-qt4 adwaita-qt5 sudo pacman -S qtconfig-qt4 q ...

  8. Arch Linux中使用VMware Workstation不能打开vmmon内核模块

    打开VMware Workstation出现错误提示:Could not open /dev/vmmon: No such device.Please make sure that the kerne ...

  9. 洛谷P2704 炮兵阵地

    本题过于经典...... 对于这种网格状压DP,套路一波刷表法DFS转移就没了. 三进制状压,0表示当前,上一个都没有.1表示当前无,上一个有.2表示当前有. 转移的条件就是上一行为0,当前不是山地, ...

  10. bzoj2839 集合计数

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  Logout 捐赠本站 2839: 集合计数 Time ...