2.1线性表的类型定义
列2-1:假設利用兩個線性表LA和LB分布表示兩個集合A和B(即線性表中的數據元素即為集合中的元素),現要求一個新的集合A=AUB。這就要求對線性表作如下操作,擴大線性表LA,將存在于線性表LB中而不存在于線性表LA中的數據元素插入到線性表LA中去。只要從線性表LB中依次取得每個數據的元素,并依值在線性表LA中進行查訪,若存在,則插入之。上述操作過程可用下列算法描述之
void Union(List &La, List Lb) { // 將所有在線性表Lb中但不在La中的數據元素插入到La中int La_len,Lb_len,i;ElemType e;La_len = ListLength(La); // 求線性表的長度 Lb_len = ListLength(Lb);for (i=1; i<=Lb_len; i++) {GetElem(Lb, i, e); // 取Lb中第i個數據元素賦給eif (!LocateElem(La, e, equal)) // La中不存在和e相同的數據元素ListInsert(La, ++La_len, e); // 插入} } // union書中給我了偽代碼,我們現在來分析下:
1.第一行我們可以知道這個函數叫聯合,包含來個參數,一個是線性表La,一個是表Lb,且La是一個引用,這表名La是將會被修改的
2.第三行我們可以知道定義了兩個int型變量用于存La和Lb的長度
3.第四行定義了一個ElemType(我猜測這是element和type的組合表示這是一個元素類型,具體是什么類型取決于List容器里面的類型),從下面的代碼可知這個變量是為提取Lb中某個數與La中的數進行比較,
4.第五行,第六行可知他調用了一個叫ListLength的函數這函數要傳入List。返回List的長度
5.第七行是進行一個循環,這個循環是Lb的長度,從for循環第一個參數可以知道,這個List是從下標1開始,而不是從0開始。
6.第八行是GetElem函數,意思是獲取元素,從參數來看,我們知道他獲取的是Lb的第i個元素,第三個參數填寫的是e,這里我們要思考下如果e是普通類型的參數,那么他根本就無法回調給e(此函數無返回值,只有靠第三個參數回調數據),所以這個ElemType肯定是被typedf為*ElemType。還有一種可能,就是GetElem的第三個參數是一個引用。還是不懂的同學看下面的代碼
#include <stdio.h>typedef struct List {int Num = 1; }*list;int main() {list a;List b;b.Num = 10;a = &b;return 0; } 運行結果:7.第九行是LocateElem函數,這個用e和La中的每一個元素對比,第三個參數是equal,這個equal是提醒大家這里是比較是否相等,La中沒有數和e相等時,if條件成立
8.第十行插入e進La,并且La_Len增加1。
LA=(3,5,8,11)
LB=(2,6,8,9,11,15,20)
則LC=(2,3,5,6,8,8,9,11,11,15,20)
從上述問題要求可知,LC中的數據元素或是LA中的數據元素,或是LB中的數據元素,則只要先設LC為空表,然后將LA或LB中的元素逐個插入LC中即可。為使LC中元素按值非遞減有序排列,可設兩個指針i和j分別指向LA和LB中某個元素,若設i當前所指的元素為a,j當前所指的元素為b,則當前應插入到LC中的元素為c為c=a當a<=b時,或者c=b當a>b時
顯然,指針i和j的初始值均為1,在所指元素插入LC之后,在LA或LB中順序后移。代碼如下: void MergeList(List La, List Lb, List &Lc) { // 已知線性表La和Lb中的元素按值非遞減排列。// 歸并La和Lb得到新的線性表Lc,Lc的元素也按值非遞減排列。int La_len, Lb_len;ElemType ai, bj; int i=1, j=1, k=0;InitList(Lc);La_len = ListLength(La); Lb_len = ListLength(Lb);while ((i <= La_len) && (j <= Lb_len)) { // La和Lb均非空GetElem(La, i, ai);GetElem(Lb, j, bj);if (ai <= bj) {ListInsert(Lc, ++k, ai);++i;} else { ListInsert(Lc, ++k, bj);++j;}}while (i <= La_len) {GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);}while (j <= Lb_len) {GetElem(Lb, j++, bj); ListInsert(Lc, ++k, bj);} } // MergeList 書中給我了偽代碼,我們現在來分析下:1.函數MergList,意思是混合鏈,我們可以知道有三個參數La,Lb和&Lc,Lc是要被修改的,所以設為引用
2.InitList是初始化了List,從這里我們可看出,InitList里面那個參數一個是引用
3.第一個while當一個List從頭遍歷到尾后就結束(剩下的直接加進去后面那兩個while就是這個功能)
總結
以上是生活随笔為你收集整理的2.1线性表的类型定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机组成原理 北理,北京理工大学计算
- 下一篇: kl散度度量分布_概率图简要模型笔记(二