線性表的應用 求自然鏈結

2021-08-22 13:32:31 字數 2051 閱讀 9884

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...