c语言现代发方法19章学习经历记录

2023-05-16

19.4.5用栈实现抽象数据类型
        这里简直太牛了,直接定义一个结构体类型的栈,里面是一个头节点(也是一个指针),后面直接定义一个栈的指针对象,那么就可以随意改变栈里面的内容(也就是头节点),就能达到链表操作的所有要求。
切身体会:如果要定义一个链表,那么直接先定义一个节点类型,然后再定义一个链表类型(里面就 放置这个链表的头节点就可以了,以后只要定义一个这样的链表类型(最好是动态分配定义,
 后面直接可以用指针操作这个链表了),不管后面如何操作,执行任何操作,都太方便了。

//stackADT_linkList.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>  //c99 only
#include "stackADT_linkList.h"



struct node{
	struct node * next;
	Item data;
};

struct stack_type{
	struct node * top;
};

void terminate(const char * message)
{
	printf("%s\n",message);
	exit(EXIT_FAILURE);
}


Stack create(void)
{
	Stack first_node = malloc(sizeof(struct stack_type));
	if(first_node == NULL)
		terminate("Error in create:no space to create new node.\n");
	first_node -> top = NULL;
	return first_node;
}

bool is_full(const Stack s)
{
	return true;

}

bool is_empty(const Stack s)
{
	return s->top == NULL;
}

void destroy(Stack  s)
{
while(s->top != NULL)
	{
		pop(s);
	}
free(s);
}

void push(Stack  s,Item t)
{
	struct node * new_node  = malloc(sizeof(struct node));
	if(new_node == NULL)
		{
			terminate("Error in push,can't creat new node.\n");	
		}
	new_node -> data = t;
	new_node -> next = s -> top;
	s -> top = new_node;
}

Item pop(Stack  s)
{
if(s -> top == NULL)
	{
		terminate("Error in pop:stack is empty.\n");
	}
struct node * old_node = s -> top;
s -> top = s -> top -> next;
Item data = old_node -> data;
free(old_node);
}


void print(const Stack s)
{
	struct node * ptr = s -> top;
	if(ptr == NULL)
		printf("Stack is empty.\n");
	while(ptr != NULL)
		{
			printf("%d ",ptr -> data);
			ptr = ptr -> next;	
		}
	printf("\n");

}


//main.c

#include "stackADT_linkList.h"

int main(void)
{
	Stack s1,s2;
	s1 = create();
	s2 = create();

	push(s1,1);
	print(s1);
	push(s1,2);
	print(s1);
	pop(s1);
	print(s1);
	pop(s1);
	print(s1);
	destroy(s1);
	destroy(s2);
	
	return 0;
}
//文件 stackADT_linkList.h

#ifndef STACK_ADT_LINKLIST
#define STACK_ADT_LINKLIST

#include <stdbool.h>   //c99 only
typedef  int Item;


struct stack_type; //declare a incomplete type
typedef struct stack_type *Stack;

Stack create(void);
void terminate(const char *);
bool is_full(const Stack );
bool is_empty(const Stack );
void destroy(Stack );
void push(Stack ,Item );
Item pop(Stack  );
void print(const Stack );


#endif

运行结果:

1 
2 1 
1 
Stack is empty.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言现代发方法19章学习经历记录 的相关文章

随机推荐

  • 顺序栈的创建与使用

    顺序栈的创建与使用 首先是各种函数的头文件声明 这里还另外定义了一个数据类型的宏 xff0c int类型数据暂时用作TYPE替换 xff0c 也可以替换成其他类型数据 然后是设计数据结构体 xff0c 这里定义了三个成员变量 其次是实现各项
  • 利用C++模板封装链表

    利用C 43 43 实现链表模板类 include lt iostream gt include lt stdlib h gt using namespace std template lt typename T gt class Node
  • 利用套接字创建本地socket文件完成本地进程间通信

    利用套接字创建socket文件完成本地两个进程之间的通信 xff0c 这里分为进程A和进程B 进程A 头文件 进程A里面首先是各种头文件 xff1a 1 include lt stdio h gt 2 include lt stdlib h
  • C++在字符串中搜索特定的字符

    C 43 43 在字符串中搜索特定的字符 在字符串中搜索特定字符是指在字符串中寻找是否存在指定的字符或字符集 include lt iostream gt int main int argc const char argv std stri
  • C++中在字符串中提取子字符串

    C 43 43 中在字符串中提取子字符串 从字符串中提取子字符串是指将一个字符串中的一部分截取下来形成一个新的字符串 include lt iostream gt int main int argc const char argv std
  • C++中如何访问字符串中的单个字符

    访问字符串中的单个字符 访问字符串中的单个字符是像字符数组那样使用下标访问字符串中的某个元素 include lt iostream gt int main int argc const char argv std string str1
  • c中有时候一个名字具有块作用域但是有外部链接的一个例子

    文件1 c include lt stdio h gt void f void s具有块作用域 xff0c 但是具有外部链接 extern int s printf 34 d n 34 s int main f return 0 文件2 c
  • Javascript Map 对象使用说明

    Map 是 ES6 中引入的一种新的数据结构 xff0c 对象保存键值对 任何值 对象或者原始值 都可以作为一个键或一个值 以前用的JS对象 Object也是可以把其属性看作键来定位数据 xff0c 但 Map 和 Object 是有区别的
  • 如何将Mac备份到外置硬盘?

    Apple爱好者喜欢该其设备的时尚设计和简单的用户界面 然而 xff0c 设置Mac的备份可能会令人沮丧 xff0c 因为大多数外部硬盘驱动器在使用之前必须进行格式化 然而 xff0c 如果了解如何将Mac备份到外部硬盘驱动器后 xff0c
  • C++中字符串的交换与复制

    字符串的交换是指将两个字符串的内容互相交换 字符串复制是指生成一个新的字符串其内容为原有字符串的内容 include lt iostream gt int main std string str1 61 34 Hello 34 std st
  • Kali2022安装Docker和Docker-compose以及更改国内镜像源

    装之前可以选择更新一下软件库 root kali apt update 安装docker root kali apt install docker io root kali docker version 查看Docker版本 root ka
  • Mac系统配置php环境

    写在前面 叨叨叨 急着配环境的同志们可以绕道 最近学校的实验室里接了一个小项目 考勤刷卡系统 xff0c 利用RFID在硬件层获取学生卡的ID xff0c 通过wifi传输至服务器 xff0c 进行考勤信息存储 xff0c 手机端获取服务器
  • 病毒变种--C语言练习

    病毒变种 病毒DNA可以表示成由一些字母组成的字符串序列 xff0c 且病毒的DNA序列是环状的 例如 xff0c 假设病毒的DNA序列为baa xff0c 则该病毒的DNA序列有三种变种 xff1a baa aab aba 试编写一程序
  • http、https 等 常用默认端口号

    HTTP协议代理服务器常用端口号 xff1a 80 8080 3128 8081 9080 SOCKS代理协议服务器常用端口号 xff1a 1080 FTP xff08 文件传输 xff09 协议代理服务器常用端口号 xff1a 21 Te
  • 网络传输性能netperf测试方法和下载

    简介 Netperf是一种网络性能的测试工具 xff0c 主要针对基于TCP或UDP的传输 Netperf根据应用的不同 xff0c 可以进行不同模式的网络性能测试 xff0c 即批量数据传输 xff08 bulk data transfe
  • 个人服务器(Linux)安装confluence

    个人服务器 Linux 安装confluence 文章目录 个人服务器 Linux 安装confluence 前言 一 服务器配置 二 JDK环境安装 1 下载java8 2 上传安装包 3 解压缩并重命名 4 配置jdk环境变量 5 测试
  • 关于Windows利用Mstsc远程访问Ubutu的VNC方法

    这里发现了一篇网上很好的文章 xff0c 实现也很顺利 xff0c 因此将那篇文章直接引用过来 地址为 xff1a https www cnblogs com xuliangxing p 7642650 html
  • VSCode 常用且好用的插件推荐

    python相关插件 Tabnine AI代码提示器 xff08 支持JavaScript Python Java Typescript amp all other languages xff09 Python vscode 的 pytho
  • Qt中实现图片透明度设置与显示

    在使用QGraphicsScene过程中 xff0c 想要实现背景和前景图层叠加显示 xff0c 需要设置对应层绘图的透明度的设置 采用重写drawBackground QPainter painter const QRectF amp r
  • c语言现代发方法19章学习经历记录

    19 4 5用栈实现抽象数据类型 这里简直太牛了 xff0c 直接定义一个结构体类型的栈 xff0c 里面是一个头节点 xff08 也是一个指针 xff09 后面直接定义一个栈的指针对象 xff0c 那么就可以随意改变栈里面的内容 xff0