liststack——链表栈(procedure)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "stack.h"
#define NAMESIZE 24
typedef struct stuinfo{
int id;
char name[NAMESIZE];
int math;
}DATA;
static void print_s(const void *data)
{
const DATA *stup = data;
printf("%d %s %d\n",
stup->id,
stup->name,
stup->math);
}
static int IdCmp(const void *key, const void *data)
{
const int *id = key;
const DATA *stup = data;
return (*id - stup->id);
}
static int NameCmp(const void *key, const void *data)
{
const char *name = key;
const DATA *stup = data;
return strcmp(name, stup->name);
}
int main()
{
int i;
int id = 5;
char name[NAMESIZE] = "stu3";
DATA stu, *stup;
STACK s = NULL;
s = StackCreate(sizeof(DATA));
if(s == NULL)
return -1;
for(i = 0; i < 6; i++)
{
stu.id = i + 1;
snprintf(stu.name,NAMESIZE,
"stu%d", i + 1);
stu.math = 100 - i;
PushStack(s, &stu);
}
PopStack(s);
stup = TopOfStack(s);
print_s(stup);
TopAndPopStack(s, &stu);
StackDisplay(s, print_s);
StackDispose(s);
return 0;
}
----------------------------------------------------------
#ifndef _STACK_H__
#define _STACK_H__
#include "list.h"
typedef LIST STACK;
STACK StackCreate(int);
int StackIsEmpty(STACK);
int PushStack(STACK, const void *);
int PopStack(STACK);
void* TopOfStack(STACK);
int TopAndPopStack(STACK, void *);
void StackDisplay(STACK, print *);
void StackDispose(STACK);
#endif
---------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "stack.h"
STACK StackCreate(int size)
{
return ListCreate(size);
}
int StackIsEmpty(STACK s)
{
return s->head.next == &s->head;
}
int PushStack(STACK s, const void *data)
{
return ListInsert(s, data, HEADINSERT);
}
static int always_match(const void *key, const void *data)
{
return 0;
}
int PopStack(STACK s)
{
return ListDelete(s, (void *)0, always_match);
}
void* TopOfStack(STACK s)
{
return ListFind(s, (void *)0, always_match);
}
int TopAndPopStack(STACK s, void *data)
{
return ListFetch(s, (void *)0, always_match, data);
}
void StackDisplay(STACK s, print *funp)
{
ListDisplay(s, funp);
}
void StackDispose(STACK s)
{
ListDispose(s);
}
-------------------------------------------------------------------------
#ifndef _LIST_H__
#define _LIST_H__
#define HEADINSERT 1
#define TAILINSERT 2
struct listnode;
struct headnode;
typedef struct headnode *LIST;
typedef struct listnode *PtrNode;
typedef void print(const void *);
typedef int cmp(const void *, const void *);
LIST ListCreate(int);
int ListInsert(LIST, const void *, int);
void *ListFind(LIST, const void *, cmp *);
int ListDelete(LIST, const void *, cmp *);
int ListFetch(LIST, const void *, cmp *, void *);
void ListDisplay(LIST, print *);
void ListDispose(LIST);
struct listnode{
void *data;
struct listnode *prev;
struct listnode *next;
};
struct headnode{
int size;
struct listnode head;
};
#endif
-----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
LIST ListCreate(int size)
{
LIST handle = malloc(sizeof(*handle));
if(NULL == handle)
return NULL;
handle->size = size;
handle->head.data = NULL;
handle->head.prev = handle->head.next = &handle->head;
return handle;
}
int ListInsert(LIST l, const void *data, int mode)
{
PtrNode cur = malloc(sizeof(*cur));
if(NULL == cur)
return -1;
cur->data = malloc(l->size);
if(NULL == cur->data)
{
free(cur);
return -2;
}
memcpy(cur->data, data, l->size);
if(mode == HEADINSERT)
{
cur->next = l->head.next;
cur->prev = &l->head;
}
else if(mode == TAILINSERT)
{
cur->next = &l->head;
cur->prev = l->head.prev;
}
else
{
free(cur->data);
free(cur);
return -3;
}
cur->prev->next = cur;
cur->next->prev = cur;
return 0;
}
static PtrNode find(LIST l, const void *key, cmp *funp)
{
PtrNode p = l->head.next;
for(;p != &l->head && funp(key, p->data); p = p->next);
return p;
}
void *ListFind(LIST l, const void *key, cmp *funp)
{
return find(l, key, funp)->data;
}
int ListDelete(LIST l, const void *key, cmp *funp)
{
PtrNode p = find(l, key, funp);
if(p == &l->head)
return -1;
p->prev->next = p->next;
p->next->prev = p->prev;
//p->prev = p->next = NULL;
free(p->data);
free(p);
//p = NULL;
return 0;
}
int ListFetch(LIST l, const void *key, cmp * funp, void *data)
{
PtrNode p = find(l, key, funp);
if(p == &l->head)
return -1;
memcpy(data, p->data, l->size);
p->prev->next = p->next;
p->next->prev = p->prev;
//p->prev = p->next = NULL;
free(p->data);
free(p);
//p = NULL;
return 0;
}
void ListDisplay(LIST l, print *funp)
{
PtrNode p = l->head.next;
while(p != &l->head)
{
funp(p->data);
p = p->next;
}
}
void ListDispose(LIST l)
{
PtrNode p = l->head.next;
PtrNode q;
while(p != &l->head)
{
q = p;
p = p->next;
free(q->data);
free(q);
}#FLAGS = -lmylist
all:main
main:main.o list.o stack.o
clean:
rm -f *.o main
free(l);
}
--------------------------------------------
liststack——链表栈(procedure)的更多相关文章
- C语言 复杂的栈(链表栈)
//复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...
- java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue
LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- bzoj 1098 办公楼biu —— 链表+栈
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 首先,没有连边的人一定得在一个连通块里: 先把所有人连成一个链表,然后从第一个人开始, ...
- 链表栈C语言实现
#ifndef LINKSTACK_H_INCLUDED #define LINKSTACK_H_INCLUDED #include <stdlib.h> #include <std ...
- 链表栈的C语言实现
#ifndef _CONST_H_#define _CONST_H_ #include <stdio.h>#include <stdlib.h> typedef enum { ...
- 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)
- 二叉树、栈、队列、链表的Java代码实现
这是我的学习总结. 如有文章存在谬误,欢迎指出,有其他意见或者建议,也欢迎留言 二叉树链表 前序遍历:先访问根节点,然后访问左子树.右子树 中序遍历:先访问左子树,然后访问根节点.右子树 后序遍历:先 ...
- 用OC实现一个栈:结合单链表创建动态栈
一.介绍 栈是一种数据存储结构,存储的数据具有先进后出的特点.栈一般分为动态栈和静态栈. 静态栈比较好理解,例如用数组实现的栈.动态栈可以用链表来实现. 方式:固定base指针,每次更改top指向入栈 ...
随机推荐
- Open judge 06月度开销
06:月度开销 总时间限制: 1000ms 内存限制: 65536kB 传送门 描述 农夫约翰是一个精明的会计师.他意识到自己可能没有足够的钱来维持农场的运转了.他计算出并记录下了接下来 N (1 ≤ ...
- HDU 5491 The Next
Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...
- 关于移动div的具体实现(js)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Centos6.5安装
前奏:CentOS 6.5下载地址http://mirror.centos.org/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1to2.torre ...
- 帝国cms7.0设置标题图片(缺失状态下)
有时候因为我们没有设置标题图片,程序就会是使用自己的标题图片,这就是问题所在,现在有2个办法解决这个问题, [1]直接替换调程序的标签图片,但是这样的方法虽然简单,但是图片大小固定,要是每个模版的图片 ...
- 第三方:GDataXMLNode:xml解析库--备用
一.GDataXMLNode说明 GDataXMLNode是Google提供的用于XML数据处理的类集.该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且 ...
- "Invalid bound statement (not found): com.sitech.admin.dao.TbOpenAbilityInfoDao.findAbilityReadyUp"mybatis配置文件bug
问题描述: 通常在正常启动某项工程后操作某个功能时抛出的bug: org.apache.ibatis.binding.BindingException: Invalid bound statement ...
- php生成二维码,使用qrcode类库创建
传说Google有个接口,可以生成二维码,这让我有点鸡冻不已,于是,......(省略1000字).结果,我找到了另外一个方法,是使用一个php类库,该工具叫:qrcode,但下载该工具可真是要人命. ...
- 在 ActionBar 添加刷新按钮
在以前版本的 Gmail 应用中,ActionBar 上有个刷新菜单,点击一下刷新菜单变成一个转圈的刷新标示动画图片. 之前实现该功能的时候都是使用一个类库 RefreshActionItem来实现的 ...
- Android开源项目发现--- 传感器篇(持续更新)
Great Android Sensing Toolkit Android感应器工具包,包含示例及使用过程中可能需要的算法 项目地址:https://github.com/gast-lib/gast- ...