資料庫存儲鏈表
⑴ 請教各位,一個鏈表如何用資料庫來存貯
#include <stdio.h>
#include <memory>
typedef struct Lnode
{
int data;
Lnode* next;
}Lnode;
Lnode* creatLink()
{
int i;
Lnode *cur,*pre,*head;
head=(Lnode*)malloc(sizeof(Lnode));
for(i=1,pre=head;i<=20;i++)
{
cur=(Lnode*)malloc(sizeof(Lnode));
cur->data=i;
cur->next=NULL;
pre->next=cur;
pre=pre->next;
}
return head;
}
int main()
{
FILE *fp,*fp1;
if((fp=fopen("abc.dat","w"))==NULL)
{
printf("打開abc.dat有問題!");
return -1;
}
Lnode *root=creatLink();
while(root=root->next)
{
fwrite(root,sizeof(Lnode),1,fp);
}
fclose(fp);
if((fp1=fopen("abc.dat","r"))==NULL)
{
printf("打開abc.dat有問題!");
return -1;
}
Lnode *root1=(Lnode*)malloc(sizeof(Lnode));
while(!feof(fp1))
{
fread(root1,sizeof(Lnode),1,fp1);
printf("%d ",root1->data);
if(root1->next)
root1=root1->next;
}
fclose(fp1);
}
⑵ 如何將長鏈表數據寫入資料庫
#include <stdio.h>#include <stdlib.h>#include <string.h> typedef struct datanode { char name[24]; char phone[12]; // ...... struct datanode *next;}*pNode,*LinkList,Node; LinkList getEmptyList() { LinkList head = (pNode)malloc(sizeof(Node)); head->next = NULL; return head;} void addNode(LinkList head, pNode pnode) { pnode->next = head->next; head->next = pnode;} void writeFile(LinkList head) { FILE *outf; pNode p = head->next; if((outf = fopen("data.txt","wt")) == NULL) { printf("不能打開數據文件。\n"); exit(1); } while(p) { fwrite(p,sizeof(Node),1,outf); p = p->next; } fclose(outf);} int main() { char name[24],phone[12]; // ...... pNode p; LinkList head = getEmptyList(); printf("姓名 聯系電話\n"); while(scanf("%s%s",name,phone) == 2) { p = (pNode)malloc(sizeof(Node)); strcpy(p->name,name); strcpy(p->phone,phone); addNode(head,p); printf("姓名 聯系電話(<Ctrl + Z> <ENTER> 結束)\n"); } writeFile(head); return 0;
⑶ 【討論】數據結構——數據的存儲結構
1.「循環隊列」與存儲結構有關,即是與計算機在內存中實現有關的概念。「隊列」本是一個邏輯概念,但「循環隊列」特指在內存中依地址順序存放「數據元素」,當隊尾越過規定內存區域的下界時,調整隊尾指向內存區域的上界,繼續進行入隊操作。
2.「鏈表」無疑與存儲結構有關。也就是在體現「數據元素」之間關系時增加一或多個「域」,用於存放相關聯的「數據元素的地址」。
3.「哈希表」也與存儲結構有關。「哈希表」一般是為了查找某個「數據元素」方便,而將有某種關系的一組「數據元素」集中放置,並為各組數據生成一個連續的「索引」(正如數組下標)。在實現時就用連續的內存地址來體現。
4.「棧」僅是一個邏輯概念,LIFO(後進先出),並不涉及具體的物理實現。即與存儲結構無關。
⑷ 資料庫技術知識數據結構的演算法
資料庫技術知識數據結構的演算法
對於將要參加計算機等級考試的考生來說,計算機等級考試的知識點輔導是非常重要的復習資料。以下是我收集的資料庫技術知識數據結構的演算法,希望大家認真閱讀!
1、數據:數據的基本單位是數據元素。數據元素可由一個或多個數據項組成。數據項是數據的不可分割的最小單位
2、數據結構:數據的邏輯結構、數據的存儲結構、數據的運算
3、主要的數據存儲方式:順序存儲結構(邏輯和物理相鄰,存儲密度大)和鏈式存儲結構
順序存儲結構:
順序存儲計算公式 Li=L0+(i-1)×K 順序結構可以進行隨機存取;插人、刪除運算會引起相應節點的大量移動
鏈式存儲結構:a、指針域可以有多個,可以指向空,比比順序存儲結構的存儲密度小
b、邏輯上相鄰的節點物理上不一定相鄰。 c、插人、刪除等不需要大量移動節點
4、順序表:一般情況下,若長度為n的順序表,在任何位置插入或刪除的概率相等,元素移動的平均次數為n/2(插入)和(n-1)/2(刪除)。
5、鏈表:線性鏈表(單鏈表和雙向鏈表等等)和非線性鏈表
線性鏈表也稱為單鏈表,其每個一節點中只包含一個指針域,雙鏈表中,每個節點中設置有兩個指針域。(注意結點的插入和刪除操作)
6、棧:“後進先出”(LIFO)表。棧的應用:表達式求解、二叉樹對稱序周遊、快速排序演算法、遞歸過程的實現等
7、隊列:“先進先出”線性表。應用:樹的層次遍歷
8、串:由零個或多個字元組成的有限序列。
9、多維數組的順序存儲:
10、稀疏矩陣的存儲:下三角矩陣順序存儲
其他常見的存儲方法還有三元組法和十字鏈表法
11、廣義表:由零個或多個單元素或子表所組成的有限序列。廣義表的元素可以是子表,而子表的元素還可以是子表
12、樹型結構:非線性結構。常用的樹型結構有樹和二叉樹。
二叉樹與樹的區別:二叉樹不是樹的特殊情況,樹和二叉樹之間最主要的區別是:二叉樹的節點的子樹要區分左子樹和右子樹,即使在節點只有一棵子樹的情況下也要明確指出該子樹是左子樹還是右子樹。
13、樹(森林)與二叉樹之間的轉換(要會轉換)
14、二叉樹和樹的周遊(遍歷)
二叉樹的周遊主要有以下3種方式:前序法(NLR)、對稱序法(LNR)、後序法(LRN)
周遊樹和樹林:深度優先和按廣度優先兩種方式進行。深度優先方式又可分為按先根次序和按後根次序周遊
樹與二叉樹周遊之間的對應關系:按先根次序周遊樹正好與按前序法周遊樹對應的二叉樹等同,後根次序周遊樹正好與按對稱序法周遊對應的`二叉樹等同
按廣度優先方式就是層次次序周遊
15、二叉樹的存儲和線索
二叉樹的存儲結構:二叉樹的llink一rlink法存儲表示
線索二叉樹:在有n個節點的二叉樹的且llink - rlink法存儲表示中,必定有n+1個空指針域
16、哈夫曼樹:一類帶權路徑長度最短的樹。樹的帶權路徑長度為樹中所有葉子節點的帶權路徑長度之和WPL。
17、查找:
(1)順序查找:平均查找長度為(n +1 )/2次,時間復雜度為O(n)
(2)二分法查找:線性表節點必須按關鍵碼值排序,且線性表是以順序存儲方式存儲的。查找成功比較次數log2n,查找失敗比較次數log2n+1
(3)分塊查找:先是塊間查找,然後塊內查找。
(4)散列表(哈希表Hash)的存儲和查找:處理沖突的方法:開地址法(線性探測法)、拉鏈法等
負載因子(裝填因子)=表實際存儲的結點個數/表的最大能存儲結點個數(即表長)
二叉排序樹:每個結點左子樹的所有關鍵碼值都小於該結點關鍵碼值,右子樹所有結點關鍵碼值都大於該結點關鍵碼值。對稱周遊二叉排序樹,得到一個有序序列,時間復雜度O(log2n)
B樹和B+樹:M階樹,每個結點至多有M-1個關鍵碼,至少有M/2(取上界)-1個關鍵碼。B樹適合隨機查找,不適合順序查找。B+樹適合順序查找。
18、排序
直接插人排序、希爾排序、直接選擇排序、堆排序、起泡排序、快速排序等排序演算法要了解。
直接選擇排序、希爾排序、快速排序和堆排序是不穩定排序,其他排序為穩定排序
;