自我參考結構 (self-reference – 1)

Slides:



Advertisements
Similar presentations
电子成绩单项目实现.
Advertisements

親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
Loops.
第三章 鏈結串列 Linked List.
補充: Input from a text file
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
第4章 串 串的基本概念和C语言的串函数 串的存储结构 动态数组实现的顺序串 串的模式匹配算法——BF算法 主要知识点.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
C语言程序设计 课程 第5章 数组 主讲:李祥 博士、副教授 单位:软件学院软件工程系.
程式設計 博碩文化出版發行.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
第11章 查找 主要知识点 查找的基本概念 静态查找表 动态查找表 哈希表.
佇列 (Queue).
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
資料結構 第5章 佇列.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
適用於多選一 可減少if 與 else配對混淆的錯誤.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
STRUCTURE 授課:ANT 日期:2010/5/12.
第十五章 Linked List, Stack and Queue
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
Function.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.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 堆疊的應用 - 運算式的計算與轉換
第四章 C 语言中的输入和输出.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
C语言 程序设计基础与试验 刘新国、2012年秋.
第三章 栈和队列.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
THE C PROGRAMMING LANGUAGE
第三章 栈和队列.
計數式重複敘述 for 迴圈 P
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
資料結構 第4章 堆疊.
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
二叉树的遍历.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
C语言概述 第一章.
Linked Lists Prof. Michael Tsai 2013/3/12.
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
Introduction to the C Programming Language
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第四章 C 语言中的输入和输出.
本节内容 指针类型.
Introduction to the C Programming Language
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
資料!你家住哪裏? --談指標 綠園.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Q1 以下是10個初生嬰兒,首6個月的體重改變紀錄
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Introduction to the C Programming Language
Presentation transcript:

自我參考結構 (self-reference – 1) 一個結構中所含的成員中,有成員型態與本身相同 含有一個指向相同型態之結構的指標成員 常用於動態資料結構的應用,可以在執行時變大、變小 stack, queue, linked list, tree, … stack 先進後出 queue 先進先出 single-link linked list tree double-link linked list

自我參考結構 (self-reference – 2) struct node {    int data1;    char data2;           .......    struct node *ptr; }; 單一鍊結串列 指到一個同樣是node的結構 DATA PTR DATA PTR 相同的結構型態

用結構來模擬 Stack (1/5) 一開始時,整個stack是空的(NULL) 每加入一筆新的資料時 (push) 先要一塊記憶體來存新結構 把值存入新結構中 把結構中的指標指到原本的頂端(top) 把stack的頂端指到新要的結構 要拿出一筆資料時(pop) 把頂端結構的內容拿出來傳回 把stack的頂端指到下一層 歸還該層記憶體 應用:pre-fix, in-fix, post-fix表示法 stack 先進後出

用結構來模擬 Stack (2/5) #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct stack_node_s{ //定義每筆資料的結構 char data; struct stack_node_s *restp; }stack_node_t; typedef struct{ //定義頂端指標結構 stack_node_t *topp; }stack_t; void push(stack_t *sp, char c) //增加新資料 { stack_node_t *newp; printf("put '%c' into stack\n", c); newp = (stack_node_t *)malloc(sizeof(stack_node_t));

用結構來模擬 Stack (3/5) newp->data = c; newp->restp = sp->topp; sp->topp = newp; } char pop(stack_t *sp) //取出資料 { stack_node_t *to_freep; char ans; to_freep = sp->topp; ans = to_freep->data; sp->topp = to_freep->restp; free(to_freep); return ans;

用結構來模擬 Stack (4/5) int main(void) { stack_t s = {NULL}; //程式一開始stack是空的 char str[80]; int i, l; printf(“Please enter a string for stack: "); gets(str); for(i = 0, l = strlen(str); i < l; i++) push(&s,str[i]); printf("the data popped from stack are listed in the follows\n"); while (s.topp != NULL) printf("pop '%c' from stack\n",pop(&s)); return 0; }

用結構來模擬 Stack (5/5) Please enter a string for stack: pushpop put 'p' into stack put 'u' into stack put 's' into stack put 'h' into stack put 'o' into stack the data popped from stack are listed in the follows pop 'p' from stack pop 'o' from stack pop 'h' from stack pop 's' from stack pop 'u' from stack

用結構來模擬 Queue (1/5) 一開始時,整個queue是空的(NULL) 每加入一筆新的資料時 要拿出一筆資料時 front 跟 rear 都指到 NULL 每加入一筆新的資料時 先要一塊記憶體來存新結構 當queue空的時候,front 跟 queue指到同一地方 否則 front 不變,rear指到原本rear的後面 將值存入,並且queue的大小加一 要拿出一筆資料時 把 front的值傳回 把queue的front指到下一個 歸還該層記憶體 如果queue大小為0時,代表queue已空 queue 先進先出

用結構來模擬 Queue (2/5) #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct queue_node_s { //定義每筆資料的結構 char element; struct queue_node_s *restp; } queue_node_t; typedef struct { //定義queue的結構(兩個指標及大小) queue_node_t *frontp, *rearp; int size; } queue_t; void addq(queue_t *qp, char c) //增加新一筆資料 { printf("put '%c' into queue\n", c);

用結構來模擬 Queue (3/5) if (qp->size == 0){ //當queue是空的時候 qp->rearp = (queue_node_t *)malloc(sizeof(queue_node_t)); qp->frontp = qp->rearp; } else { //當queue不是空的時候 qp->rearp->restp = (queue_node_t *)malloc(sizeof(queue_node_t)); qp->rearp = qp->rearp->restp; qp->rearp->element =c; (qp->size)++; char removeq(queue_t *qp) { //取出一筆資料 queue_node_t *to_freep; char ans; to_freep = qp->frontp; ans = to_freep->element; qp->frontp = to_freep->restp;

用結構來模擬 Queue (4/5) free(to_freep); (qp->size)--; if(qp->size == 0) qp->rearp = NULL; //當資料拿光的時候 return ans; } void main(void) { queue_t q = {NULL, NULL, 0}; //宣告queue char str[80]; int i, l; printf("Please enter a string for queue:"); gets(str); for(i = 0, l = strlen(str); i < l; i++) addq(&q,str[i]); printf("the elements removed from queue are listed in the follows\n"); while (q.frontp != NULL) printf(“remove ‘%c’ from queue \n”,removeq(&q));

用結構來模擬 Queue (5/5) Please enter a string for queue:addqueue put 'a' into queue put 'd' into queue put 'q' into queue put 'u' into queue put 'e' into queue the elements removed from queue are listed in the follows remove 'a' from queue remove 'd' from queue remove 'q' from queue remove 'u' from queue remove 'e' from queue

鏈結串列 (linked-list) 鏈結串列是資料結構中很重要的一種,他是把節點與節點間以指標鏈結串起來 就形式來分有單鏈(single link)與雙鏈(double link)兩種 由於是串列,所以運作必須是循序的 單鏈鏈結串列 只能單方向運作,較簡單,但無法反方向運作 雙鏈鏈結串列 較複雜,可以順向及反向運作

單鏈鏈結串列 因操作不同,所以作法都不太一樣 我們以類似stack的方式來說明 一開始list是空的 每加入一筆新的資料時 先要一塊記憶體來存新結構 當list空的時候,list的指標指到新成員,而新成員的下一個指標指到NULL 否則新成員的下一個指到目前list所指的成員,然後再將list指到新成員 list空的時候 list已經有值的時候 list list New NULL New

單鏈鏈結串列範例 (1/4) #include <stdio.h> #include <stdlib.h> typedef struct node{ //定義點的結構 int id; float grad; struct node *next; } student; typedef struct{ //定義一個指到linked-list的指標 student *link; } student_p; void adds(int id, float grad, student_p *list) { //增加一比新資料 student *news; news = (student *)malloc(sizeof(student)); if(list->link != NULL){ //如果linked-list中已經有資料了 news->next = list->link;

單鏈鏈結串列範例 (2/4) list->link = news; } else{ //如果linked-list是空的 news->next = NULL; news->id = id; news->grad = grad; void dump(student_p *list) { //把linked-list的值列印出來,並free掉 student *to_free; while(list->link != NULL){ printf("id: %d grad:%f\n", list->link->id, list->link->grad); to_free = list->link; list->link = list->link->next; free(to_free);

單鏈鏈結串列範例 (3/4) } int main(void) { student_p list = {NULL}; int id; float grad; char str[30]; while(1){ //讓使用者輸入資料,若id == 0結束 printf("Please enter student id(input 0 to quit): "); gets(str); id = atoi(str); if(id == 0) break; printf("Please enter the grad of %d: ", id); grad = atof(str); adds(id, grad, &list);

單鏈鏈結串列範例 (4/4) } dump(&list); return 0; 執行結果: Please enter student id(input 0 to quit): 1 Please enter the grad of 1: 65 Please enter student id(input 0 to quit): 2 Please enter the grad of 2: 90 Please enter student id(input 0 to quit): 3 Please enter the grad of 3: 70 Please enter student id(input 0 to quit): 0 id: 3 grad:70.000000 id: 2 grad:90.000000 id: 1 grad:65.000000

單鏈鏈結串列範例二 (1/5) #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct SLL_NODE { int value; struct SLL_NODE *next; } SllNode; //Single Linked List 的結構 SllNode *root; //用來儲存 Root 指標,初始化為 NULL int sll_insert(SllNode **linkp, int value){ SllNode *current,*new_node; while((current = *linkp ) != NULL && current-> value < value) linkp = &current->next; new_node = malloc(sizeof(SllNode)); if(new_node != NULL ){ new_node->value = value; new_node->next = current; *linkp = new_node; return 1; }

單鏈鏈結串列範例二 (2/5) else { return 0; //插入節點失敗 } int sll_remove(SllNode **linkp, int value){ SllNode *current; while((current = *linkp) != NULL && current->value != value) linkp = &current-> next; if(current != NULL && current->value == value) { *linkp = current-> next; free(current); return 1; else return 0; //刪除節點失敗 void dump_sll(SllNode *rootp){

單鏈鏈結串列範例二 (3/5) int i=0; while( rootp != NULL) { printf("第 %d 筆資料為 %d\n", i++, rootp->value); rootp = rootp-> next; } int main(void) { int value; do { printf("請輸入數字 : (結束請按 -1)"); //輸入資料 scanf("%d", &value); if( value != -1) { sll_insert(&root, value); dump_sll(root); //每輸入一筆就印出 List 的內容

單鏈鏈結串列範例二 (4/5) }while(value != -1); printf("請輸入欲刪除的資料 : "); scanf("%d", &value); if(sll_remove(&root, value) == 0) { printf("無法找到該筆資料,無法刪除\n"); return 0; } else { printf("該筆資料已經從 List 中移除 \n"); dump_sll(root);

單鏈鏈結串列範例二 (5/5) 執行結果: 請輸入數字 : (結束請按 -1)123 請輸入欲刪除的資料 : 234 第 0 筆資料為 123 請輸入數字 : (結束請按 -1)234 第 1 筆資料為 234 請輸入數字 : (結束請按 -1)345 第 2 筆資料為 345 請輸入數字 : (結束請按 -1)576 第 3 筆資料為 576 請輸入數字 : (結束請按 -1)-1 請輸入欲刪除的資料 : 234 該筆資料已經從 List 中移除 第 0 筆資料為 123 第 1 筆資料為 345 第 2 筆資料為 576