1.問題描述
計算任意兩個表的簡單自然連線過程討論線性表的應用。假設有兩個表a和b,分別是m1行、n1列和m2行、n2列,它們簡單自然連線結果c=a 自然
鏈結i=
j)自 然鏈
接i=j
)b,其中i表示表a中列號,j表示表b中的列號,c為a和b的笛卡兒積中滿足指定連線條件的所有記錄組,該連線條件為表a的第i列與表b的第j列相等。例如:
資料組織
注意:頭節點和資料節點的型別不同!!!
由於每個表的行數不確定,為此用單鏈表作為表的儲存結構,每行作為乙個資料節點。
另外每行中的資料個數也是不確定的,但由於提供隨機查詢行中的資料,所以每行的資料採用順序儲存結構,這裡用長度為maxcol的陣列儲存每行的資料。因此該單鏈表中資料節點型別定義如下:
#define maxcol 10 //最大列數
typedef
struct node1 //定義資料節點型別
dlist;
另外,需要指定每個表的行數和列數,為此將單鏈表的頭節點型別定義如下:
typedef
struct node2 //定義頭節點型別
hlist;
採用尾插法建表方法建立單鏈表,使用者先輸入表的行數和列數,然後輸入各行的資料,為了簡便,假設表中資料為int型,因此定義:
typedef
int elemtype;
3.設計運算演算法
①.互動式建立單鏈表演算法:
void createtable(hlist *&h)
r->next=null; //尾節點next域置空
}
②.銷毀單鏈表演算法:
void destroytable(hlist *&h)
free(pre);
free(h);
}
③.輸出單鏈表演算法:
void disptable(hlist *h)
}
④. 為了實現兩個表h1和h2的簡單自然連線,先要輸入兩個表連線的列序號f1和f2,然後掃瞄單鏈表h1,對於h1的每個節點,從頭至尾掃瞄單鏈表h2,若自然連線條件成立,即h1的當前節點*p和h2的當前節點*q滿足:
p->data[f1-1]==q->data[f2-1]
則在新建單鏈表h中新增乙個新節點。
新建的單鏈表h也是採用尾插法建表方法建立的。
void linktable(hlist *h1,hlist *h2,hlist *&h)
q=q->next; //表2下移乙個記錄
}p=p->next; //表1下移乙個記錄
}r->next=null; //表尾節點next域置空
}
⑤.建立如下主函式呼叫上述演算法:
void main()
⑥.執行結果
表1:
表的行數,列數:3 3↙
第1行:1 2 3↙
第2行:2 3 3↙
第3行:1 1 1↙
表2:
表的行數,列數:3 2↙
第1行:3 5↙
第2行:1 6↙
第3行:3 4↙
連線欄位是:第1個表位序,第2個表位序:3 1↙
連線結果表:
1 2 3 3 5
1 2 3 3 4
2 3 3 3 5
2 3 3 3 4
1 1 1 1 6
線性表的應用
1 用順序表實現 include using namespace std define maxsize 100 typedef struct sqlist int initlist sqlist s void createlist sqlist s void listshow sqlist s ln...
線性表的鏈結表示
單鏈表以及兩個集合 交 的程式 include include using namespace std const int size 20 template class t class singlelst template class t class linearlist template clas...
線性表 順序表的應用
一 刪除順序表中所有值為x的資料元素 要求 時間複雜度為o n 空間複雜度為o 1 若用基本運算實現 void delnode1 sqlist l,elemtype x 時間複雜度為n 2 故解法為 複製保留的元素 逐個複製要保留的元素,共用空間,不需要額外空間 void delnode1 sqli...