数据结构习题课 信息学院 赵明 2005年秋.

Slides:



Advertisements
Similar presentations
第6章 二叉树和树 前面的章节主要讨论的是线性结构,二叉树和树属于非线性的结构。遍历非线性结构比线性结构要麻烦。
Advertisements

数据结构概论 第2章 线性表 董黎刚 浙江工商大学信电学院
人类传播的活动 和历史.
计算机软件技术基础 数据结构与算法(4).
数据结构——树和二叉树 1/96.
第六章 树和二叉树.
第6章 树和二叉树 (Tree & Binary Tree)
CH6 树和二叉树 6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林
第8章 查找 在英汉字典中查找某个英文单词的中文解释;在新华字典中查找某个汉字的读音、含义;在对数表、平方根表中查找某个数的对数、平方根;邮递员送信件要按收件人的地址确定位置等等。可以说查找是为了得到某个信息而常常进行的工作。 计算机、计算机网络使信息查询更快捷、方便、准确。要从计算机、计算机网络中查找特定的信息,就需要在计算机中存储包含该特定信息的表。如要从计算机中查找英文单词的中文解释,就需要存储类似英汉字典这样的信息表,以及对该表进行的查找操作。本章将讨论的问题即是“信息的存储和查找”。
TA:于波 计算机科学工程系 上海交通大学 December 5, 2009
数据结构 第6章 树和二叉树 什么是树和二叉树?? 二叉树的遍历 数据结构.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
第二章 线性表.
第2章 线性表 2.1 线性表的概念及运算 2.2 线性表的顺序存储 2.3 线性表的链式存储 2.4 一元多项式的表示及相加.
第六章 树和二叉树 6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.6 赫夫曼树及其应用.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
第3章 栈和队列 3.1 栈 3.2 队列 3.3 应用.
第2章 线性表 线性结构 是一个数据元素的有序集合。.
主要内容: 1.第一部分 概述 2.第二部分 线性表、栈、队列
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
選擇排序法 通訊一甲 B 楊穎穆.
第11章 查找 主要知识点 查找的基本概念 静态查找表 动态查找表 哈希表.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第2章 线性表(三) 1/.
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
第2章 线性表 2.1 线性表的基本概念 2.2 线性表的顺序存储 2.3 线性表的链式存储 2.4 线性表的应用 2.5 有序表 本章小结.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
第二章 线性表.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
内容回顾 线性表的定义和特点 线性表的顺序存储及查找、插入和删除.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
第九章 查找表 9.1静态查找表 9.2动态查找表 9.3哈希表及其查找.
6.3 遍历二叉树和线索二叉树(知识点二) 遍历二叉树 一、问题的提出
第九章 查找 2019/2/16.
第三章 栈和队列.
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
王玲 第 2 章 线性表 王玲 2019/2/25.
3.1 线性表及逻辑结构 3.2 线性表的顺序存储 3.3 线性表的链式存储 3.4 链式存储结构的应用
自我參考結構 (self-reference – 1)
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
第六章 树和二叉树 学习要点 理解树的定义和基本术语,重点了解二叉树的定义、性质、存储结构; 掌握二叉树遍历的递归算法及它的典型运算;
9.1 基本概念 9.2 线性表的查找 9.3 树表的查找 9.4 哈希表的查找 9.5 各种查找方法的比较
Main() { Dfas Asdfasf fasdfa } #include <stdio.h> void main( ) {
Ch.9 查找 §9.1 基本概念 查找和排序是两个重要的运算
第 四 讲 线性表(二).
第二章 线性表.
树和二叉树(一).
第 六 讲 栈和队列(一).
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第三章 线性表 3.1 线性表的类型定义 3.2 顺序存储的线性表 3.3 链式存储的线性表 3.4 有序表 3.5 顺序表和链表的综合比较.
Chapter 2 Entity-Relationship Model
第7章 图.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
本节内容 1.二叉排序树的定义 2.二叉排序树的查找操作 3.二叉排序树的插入操作 4.二叉排序树的删除操作 5.二叉排序树的总结
Presentation transcript:

数据结构习题课 信息学院 赵明 2005年秋

单链表应用(1) 已知单链表H,写一算法将其倒置。 H 29 76 18 45 25 ^ H 25 45 18 76 29 ^

单链表应用(1) 算法思路:依次取原链表中的每个节点,将其作为第一个节点插入到新链表中去。 void Reverse(Linklist L) { p=H->next; H->next=NULL; while(p) { q=p; p=p->next; q->next=H->next; H->next=q; }

单链表应用(2) 已知单链表L,写一算法,删除其重复节点。 H 10 15 18 15 10 ^ H 10 15 18 ^

单链表应用(2) 算法思路:用指针p指向第一个节点,从它的后继开始直到结束,找出与其值相同的节点并删除之;p往后走,直至结束。

单链表应用(2) void Pur_Linklist(Linklist H) { p=H->next; if(p==NULL) return; while(p->next) { q=p; while(q->next) { if(q->next->data==p->data) { r=q->next; q->next=r->next; free(r); } //end of if else q=q->next; } //end of while(q->next) p=p->next; } //end of while(p->next) }

单链表应用(3) 设有两个单链表A、B,其中元素递增有序,编写算法,将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的节点形成,不能重新申请节点。

单链表应用(3) 算法思路:利用A、B两表有序的特点,依次进行比较,将当前值较小者摘下,插入到C表的头部。

单链表应用(3) LinkList Merge(Linklist A, Linklist B) { p=A->next; q=B->next; C=A; C->next=NULL; free(B); while(p&&q) { if(p->data<q->data) { s=p; p=p->next; } //end of if else { s=q; q=q->next; } //end of else s->next=C->next; C->next=s; } //end of while(p&&q) if(p==NULL) p=q; while(p) { }

顺序表应用(1) 有顺序表A和B,其元素升序排列,写一算法将它们合并成一个顺序表C,要求C的元素也是升序排列。

顺序表应用(1) void Merge(SqList A, SqList B, SqList &C) { i=0; j=0; k=0; while(i<=A.length&&j<=B.length) if(A.data[i]<B.data[j]) C.data[k++]=A.data[i++]; else C.data[k++]=B.data[i++]; while(i<A.length) C.data[k++]=A.data[i+1]; while(j<B.length) C.data[k++]=B.data[j+1]; }

算法阅读(1) void algo(Stack *S) { int i=0; Queue Q; Stack T; 设栈S=(1,2,3,4,5,6,7),其中7为栈顶元素。请写出调用algo(&s)后栈S的状态。 void algo(Stack *S) {      int i=0;    Queue Q; Stack T;      InitQueue(&Q); InitStack(&T);      while (!StackEmpty(S)) {        if((i=!i)!=0) Push(&T,Pop(&S));        else EnQueue(&Q,Pop(&S));       }       while(!QueueEmpty(Q))         Push(&S,DeQueue(&Q));       while(!StackEmpty(T))         Push(&S,Pop(&T)); }

算法阅读(2) 已知串的存储结构为动态存储分配的顺序串 写出执行函数Strc(s, r)的结果,其中s=‘aba’,r=‘abababa’

算法阅读(2) int strc(Hstring *sub, Hstring *str) { int i=0, j, k, count=0; while(i<str->length-sub->length+1) { j=i; k=0; while(k<sub->length&&str->ch[j]==sub->ch[k]) { j++; k++; } if(k==sub->length) { count++; i=j-sub->lengh+1; else i++; return count;

简答 设有一个顺序栈S,元素s1, s2, s3, s4, s5, s6依次进栈,如果6个元素的出栈顺序为s2, s3,s4, s6, s5, s1,则顺序栈的容量至少应为多少?

算法设计 有两个栈S1和S2共享存储空间C[1..m0],其中一个栈底设在c[1]处,另一个栈底设在c[m0]处。分别编写S1和S2的进栈、出栈和设置栈空的函数。

void push(int i, int x) { if(top1==top2-1) return OVERFLOW; else if(i==1) { top1++; c[top1]=x; } else { top2--; c[top2]=x; void pop(i) { if(i=1) if(top1==0) return ERROR; else top1--; if(top1==m0+1) top2++; }

pop pop pop

void DisplayList(LinkList H) { LinkList p; p = H; while(p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); void HandleList(LinkList &H){ LinkList p, q, r; if(p == NULL) return; while(p->next) { q = p; while(q->next) { if(q->next->data == p->data) { r = q->next; q->next = r->next; free(r); else q = q->next; #include "stdio.h" #include "malloc.h" #define ElemType int typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; LinkList InitList() { LinkList H, p; int iData; H = NULL; scanf("%d", &iData); while(iData != -1) { p = (LinkList) malloc(sizeof(LNode)); p->data = iData; p->next = H; H = p; } return H;

void main() { LinkList Head; printf("Input data: "); Head = InitList(); printf("List before handled: "); DisplayList(Head); HandleList(Head); printf("List after handled: "); }

二叉树 以二叉链表为存储结构,分别写出求二叉树结点总数及叶子总数的算法。 以二叉链表为存储结构,写出求二叉树高度的算法。

结点总数 int CountNode(BiTree *root) { int numL, numR; if(root==NULL) return 0; else if(root->lchild==NULL&&root->rchild==NULL) return 1; else { numL=CountNode(root->lchild); numR=CountNode(root->rchild); return numL+numR+1; }

叶子总数 int CountLeafs(BiTree *root) { int numL, numR; if(root==NULL) return 0; else if(root->lchild==NULL&&root->rchild==NULL) return 1; else { numL=CountNode(root->lchild); numR=CountNode(root->rchild); return numL+numR; }

高度 int Depth(BiTree *root) { int depL, depR; if(root==NULL) return 0; else { depL=Depth(root->lchild); depR=Depth (root->rchild); if(depL>depR) return depL+1; else return depR+1; }

三叉链表 假设二叉树T采用三叉链表存储,其结点的lchild和rchild指针域分别指向其左、右孩子结点,而parent域为空。请编写一个递归算法,将该存储结构中各结点的parent域的值修改成指向双亲结点的指针。

void FillParent(BiTree *root) { if (root==NULL) return; if(root->lchild!=NULL){ root->lchild->parent=root; FillParent(root->lchild); } if(root->rchild!=NULL){ root->rchild->parent=root; FillParent(root->rchild);