题目详细要求、参考资料及更新发布于: http://lamda.nju.edu.cn/xiez/bop19/week_2/ 第二周 链表与指针 题目详细要求、参考资料及更新发布于: http://lamda.nju.edu.cn/xiez/bop19/week_2/

Slides:



Advertisements
Similar presentations
“三生教育”专题 生命·生存·生活.
Advertisements

第7章 樹與二元樹 (Trees and Binary Trees)
第 2 章 初探 C++.
四資二甲 第三週作業 物件導向程式設計.
程序设计实习 3月份练习解答
寻觅节日诗情.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
C++的檔案處理 綠園.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
高级语言程序设计 主讲人:陈玉华.
图形化函数库及操作 叶安胜. 图形化函数库及操作 叶安胜 EasyX 库背景 Turbo C的图形函数库的使用是很简单的,可是TC 本身环境太老了。 VC ++6.0编辑和调试环境都很优秀,也有适合教学的免费版本。可惜在 VC 想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
佇列 (Queue).
資料結構 第5章 佇列.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
哈夫曼编码.
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第一章 C++编程简介 丘志杰 电子科技大学 计算机学院 软件学院.
第 六 章 鏈結串列(Link List) 課程名稱:資料結構 授課老師:________ 2019/1/2.
五、链 表 1、单链表 2、双向链表 3、链表应用.
第10章 檔案與資料夾處理 10-1 C語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Struct結構 迴圈
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
本节内容 字节对齐.
第7章 樹與二元樹(Trees and Binary Trees)
物件導向程式設計 CH2.
C++的檔案處理 綠園.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
第三章 数据抽象.
C++大学基础教程 第10章 运算符重载 北京科技大学 2019/5/7 北京科技大学.
資料結構簡介 綠園.
第九章 物件導向-進階.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
Chapter 2 Entity-Relationship Model
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
——彻底变革算法与程序设计的教学方式 湖北省水果湖高级中学 伍先军.
第十二章 C与C C转入C++时不需改变的内容 12.2 C转入C++的一些与类无关的 新特性
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

题目详细要求、参考资料及更新发布于: http://lamda.nju.edu.cn/xiez/bop19/week_2/ 第二周 链表与指针 题目详细要求、参考资料及更新发布于: http://lamda.nju.edu.cn/xiez/bop19/week_2/

如何方便地测试程序 反复运行程序的时候一遍一遍粘贴样例输入很麻烦,怎么办? 将输入文件存成in.txt 避免粘贴的方法: 命令行里执行可执行程序(例如可执行程序命名为main)时, 用 main < in.txt ,这样 in.txt 里的内容会当作标准输入,输入给main 如果你用visual studio,可以在开头加一句freopen(“in.txt”, “r”, stdin); 记得在提交到系统的时候删掉这一行。 如果程序执行正确,应该退出掉。作业最终提交到系统的版本不要用 while(true)或getchar()等方式将程序卡在最后,否则助教评测起来会很 麻烦。前四周请只提交cpp文件到系统。

如何初始化字符数组 定义字符数组时最好将其全部初始化成0。 方法1: char a[100] = “”; 方法2: char b[100]={‘\0‘}; //这里是单引号 方法3: 在需要初始化时(程序一开始)调用: memset(a, 0, sizeof a); memset函数包含在string.h中。

我们如何评测程序? 每道题我们有5组数据; 我们会使用脚本编译你的程序,使用输入文件作为输入, 记录你的输出与正确的输出进行比较。 因此:请注意输出的大小写正确,不要输出多余的提示, 严格按照样例输入输出的格式输出。结尾请输出一个换行。 g++ -o main $1 ./main < in1.txt > tmp1.txt diff out1.txt tmp1.txt >/dev/null && printf "correct" || printf "wrong"

练习一

链表回顾 本次练习要求实现一个单链表,实现插入、删除和正逆序输出功能。链表每个节点存储 一个数字(int)。要求实现以下功能: insert_at_beginning <x>:在链表头插入数字x; insert_at_ending <x>:在链表尾插入数字x; insert_after <x> <y>:寻找链表中第一次出现数字x的位置,如果x存在,在后面插 入y; delete <x>:寻找链表中第一次出现数字x的位置,如果存在,将其删除; print <n>:依次输出链表前n个数字(空格隔开,结尾换行);特别地,如果n == - 1,输出整个链表; reverse_print <n>:逆序输出链表前n个数字(空格隔开,结尾换行);特别地,如 果n == -1,输出整个链表。 背景?敏感词过滤?

样例输入输出 Input: insert_at_beginning 1 insert_at_beginning 2 insert_at_ending 5 insert_at_ending 6 print -1 delete 6 insert_after 5 55 delete 1 print 3 reverse_print -1 Output: 2 1 5 6 2 5 55 55 5 2

链表回顾 本次题目要求实现以下函数(每个函数功能请严格按照要求完成,不要修 改): struct Node; void insert_at_beginning(int x); void insert_at_ending(int x); void insert_after(int x, int y); void delete_node(int x); void print(int n); 请用循环实现 void reverse_print(Node *node, int n);:请用递归实现。 背景?敏感词过滤?

链表回顾 如果你有能力将链表实现成一个类(class),请实现以下结构体和函数(每个函数功能请严格按 照要求完成,不要修改): class LinkedList;:链表类; class LLNode;:链表的节点类,存储数字和指向下一个节点的指针; void LinkedList::insert_at_beginning(int x); void LinkedList::insert_at_ending(int x); void LinkedList::insert_after(int x, int y); void LinkedList::delete_node(int x); void LinkedList::print(int n); void LinkedList::reverse_print(int n);:请用递归实现。因为这个函数的参数不适合进行递归,你 可能需要另外实现一个成员函数来实际完成递归,然后用reverse_print()调用那个函数。

练习二

链表 value 1 next value 2 next value 3 next value 4 next NULL 背景?敏感词过滤?

树 value 1 next value 2 next value 3 next value 4 next NULL value 5 6 next NULL value 7 next NULL 背景?敏感词过滤? value 8 next value 9 next NULL value 10 next NULL

树 深度1 深度2 深度3 深度4 根 value 1 next value 2 next value 3 next value 4 NULL value 5 next value 6 next NULL value 7 next NULL 根 背景?敏感词过滤? value 8 next value 9 next NULL value 10 next NULL

如何遍历一棵树 递归输出链表的每一个节点: void traverse(Node *node) { cout << node->value << endl; if (node->next != NULL) traverse(node->next); // 只调用一次 } 递归输出树的每一个节点: void traverse(Node *node) { cout << node->value << endl; for (each pointer p to node’s children) traverse(p); // 有几个子节点,调用几次 }

树 调用traverse(root), 前面的函数会输出树的先序遍历: 1 -> 2 -> 3 -> 4 -> 7 -> 5 -> 6 -> 8 -> 9 -> 10 value 1 next value 2 next value 3 next value 4 next NULL value 5 next value 6 next NULL value 7 next NULL 背景?敏感词过滤? value 8 next value 9 next NULL value 10 next NULL

链表分叉变成树 本次练习要求实现一个树,实现插入、删除和输出功能。树上每个节点存储一个数字(int)。 为了简化问题,树上的节点的数字不会重复。 题目要求程序读入一系列命令,按照命令构造树或输出树内容。命令的格式如下: insert_at_root <x>:在树根插入数字x,如果原来树是空的,新插入的节点即为树的 唯一节点,否则,原来的根变成新根的子节点; insert_after <x> <y>:寻找树中出现数字x的位置,如果x存在,在后面添加一个新 的分支插入y,此时刚刚插入的y应该是叶子节点。 delete <x>:寻找树中出现数字x的位置,如果存在并且该节点是叶子节点,将其删除; print <n>:递归输出树上深度不超过n的数字。以“先序遍历”的顺序输出:从根开始 输出,同一个节点的子节点,先插入的应该排在前面。特别地,如果给定n == -1,输 出整棵树。 背景?敏感词过滤?

样例输入输出 Input: insert_at_root 1 insert_at_root 2 insert_after 2 3 insert_after 2 4 insert_after 1 6 print -1 delete 6 delete 1 Output: 2 1 6 3 4 2 3 4

链表回顾 这道题目要求实现以下结构体和函数: struct TNode;:树节点类,存储数字和指向下一个节点的 (多个)指针; void insert_at_root(int x); void insert_after(TNode *node, int x, int y);请用递归实现。 void delete_node(TNode *node, int x);请用递归实现。 void print(TNode *node, int n);:请用递归实现。 背景?敏感词过滤?

链表回顾 如果你会用类,请实现以下类和函数: class Tree;:树类; class TNode;:树节点类,存储数字和指向下一个节点的(多个)指针; void Tree::insert_at_root(int x);: void Tree::insert_after(int x, int y);: void Tree::delete_node(int x); void Tree::print(int n);:请用递归实现。因为这个函数的参数不适合进行 递归,你可能需要另外实现一个成员函数来实际完成递归,然后用print() 调用那个函数。 背景?敏感词过滤?