#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)的更多相关文章

  1. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...

  2. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  3. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  4. bzoj 1098 办公楼biu —— 链表+栈

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 首先,没有连边的人一定得在一个连通块里: 先把所有人连成一个链表,然后从第一个人开始, ...

  5. 链表栈C语言实现

    #ifndef LINKSTACK_H_INCLUDED #define LINKSTACK_H_INCLUDED #include <stdlib.h> #include <std ...

  6. 链表栈的C语言实现

    #ifndef _CONST_H_#define _CONST_H_ #include <stdio.h>#include <stdlib.h> typedef enum { ...

  7. 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)

  8. 二叉树、栈、队列、链表的Java代码实现

    这是我的学习总结. 如有文章存在谬误,欢迎指出,有其他意见或者建议,也欢迎留言 二叉树链表 前序遍历:先访问根节点,然后访问左子树.右子树 中序遍历:先访问左子树,然后访问根节点.右子树 后序遍历:先 ...

  9. 用OC实现一个栈:结合单链表创建动态栈

    一.介绍 栈是一种数据存储结构,存储的数据具有先进后出的特点.栈一般分为动态栈和静态栈. 静态栈比较好理解,例如用数组实现的栈.动态栈可以用链表来实现. 方式:固定base指针,每次更改top指向入栈 ...

随机推荐

  1. ios专题 - 使用bundle文件管理资源

    [原创]http://www.cnblogs.com/luoguoqiang1985 以前,自己写程序,图片等资源放得比较乱.后来,发现有个更好的方法来管理图片等资源文件 --bundle文件. 1) ...

  2. 24种设计模式--迭代模式【Iterator Pattern】

    周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我 C,老大站在背后,赶忙站起来,“王经理,你找我?” 我说. “哦,在看技术呀.有个事情找你谈一下,你到我办公室来一下.” 老大说. 到 ...

  3. Windows phone 之Interaction.Triggers的使用

    两个步骤:1.添加以下两个程序集System.Windows.InteractivityMicrosoft.Expression.Interactions 2.添加xmlns:i="clr- ...

  4. ubuntu14.04 开启root登陆

    想要在登录界面使用root身份登录,可编辑/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf文件, sudo gedit /usr/share/light ...

  5. bootstrap上传表单的时候上传的数据默认是0 一定要小心

    bootstrap上传表单的时候上传的数据默认是0 一定要小心

  6. javascript 学习笔记之面向对象编程(二):继承&多态

    ~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...

  7. [WinJS] Promise 用法

    初学 WinJS, 可能对 Promise 的用法不大清楚,本文简要说明一下 WinJS中 promise 的基本用法. 主要参考自:http://try.buildwinjs.com/#promis ...

  8. 浙工大C语言入门指南 (仅供参考)

    C语言书籍推荐 浙工大图书馆中,计算机的书都集中在三楼TP区.我个人推荐下面这么几本书. <Head First C>.Head First系列的书质量基本都很高.该书有很多插图,总体上就 ...

  9. make xxx Is a directory. Stop.

    转自:make xxx Is a directory. Stop. 的原因 make xxx Is a directory. Stop. 的原因 编译内核时候的一个错误提示 make: ***    ...

  10. matlab的二维卷积操作

    MATLAB的conv2函数实现步骤(conv2(A,B)): 其中,矩阵A和B的尺寸分别为ma*na即mb*nb ① 对矩阵A补零,第一行之前和最后一行之后都补mb-1行,第一列之前和最后一列之后都 ...