當前位置:首頁 » 存儲配置 » 且順序存儲

且順序存儲

發布時間: 2022-05-14 00:30:22

① 線性表(a1,a2,a3,…,an)中元素遞增有序且按順序存儲與計算機內。要求完成:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct line
{
int data;
line *next;
}Line;
void print(Line *head);
void search(Line *head);
void insert(Line *head,int data);
void change(Line* q);
void search(Line *head)
{
Line *p,*q;
int data,flag=0;
q=head;
p=head->next;
printf("input data:");
scanf("%d",&data);
while (p!=NULL)
{
if(p->data==data)
{
flag=1;
break;
}
q=p;
p=p->next;
}
if(flag==0)
insert(head,data);
else if(flag==1)
change(q);
}
void change(Line* q)
{
Line *p;
p=q->next;
if(p->next==NULL)
return;
q->next=p->next;
p->next=NULL;
q=q->next;
p->next=q->next;
q->next=p;
}
void insert(Line *head,int data)
{
Line *p,*q,*r;
int flag=0;
r=(Line*)malloc(sizeof(Line));
r->next=NULL;
r->data=data;
q=head;
p=head->next;
while (p!=NULL)
{
if(p->data>=data)
{

break;
}
q=p;
p=p->next;
}
r->next=p;
q->next=r;
}
void print(Line *head)
{
Line *p;
p=head->next;
int n=0;
while (p!=NULL)
{
printf("%4d",p->data);
p=p->next;
n++;
if (n%10==0)
{
printf( "\n");
}
}
}
void main()
{
Line *head;
head=(Line*)malloc(sizeof(Line));
head->next=NULL;
while (true)
{
system("pause");
system("cls");
int c;
printf("1.insert\n");
printf("2.print\n");
printf("make a choise:");
scanf("%d",&c);
switch(c)
{
case 1:search(head);break;
case 2:print(head);break;
default:exit(1);break;
}
}

}
我有點疑問 第二句話
(2) 若找到將其與後繼元素位置交換
他不就把順序打亂了嗎 呵呵 你這個題的邏輯有問題 不過我還是幫你實現了

② 順序存儲表示法為什麼不是樹的存儲形式

順序存儲表示法是樹的存儲形式的原因:順序存儲方式不僅能用於存儲線性結構,還可以用來存放非線性結構,例如完全二叉樹是屬於非線性結構,但其最佳存儲方式是順序存儲方式。

對於一般的家譜樹(一般的多叉樹)來說,我們可以很清楚的看出層次關系,樹的層數表示代數(一共多少代人),樹的最後一層表示最後一代人,由於多叉鏈表法表示的不方便,因此被迫無奈採用孩子兄弟表示法(二叉鏈表法)。

結構

二叉樹的順序存儲就是用一組連續的存儲單元存放二又樹中的結點元素,一般按照二叉樹結點自上向下、自左向右的順序存儲。使用此存儲方式,結點的前驅和後繼不一定是它們在邏輯上的鄰接關系,非常適用於滿二又樹和完全二又樹。根據完全二叉樹和滿二叉樹的特性,假設將圖1中的完全二又樹存放在一維數組bree中,將發現結點的編號正好與數組元素的下標對應。

③ 順序存儲是二叉樹常用的存儲結構嗎

二叉樹的存儲結構
二叉樹是非線性結構,即每個數據結點至多隻有一個前驅,但可以有多個後繼。它可採用順序存儲結構和鏈式存儲結構。
1.順序存儲結構
二叉樹的順序存儲,就是用一組連續的存儲單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為一個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關系,用編號的方法從樹根起,自上層至下層,每層自左至右地給所有結點編號,缺點是有可能對存儲空間造成極大的浪費,在最壞的情況下,一個深度為k且只有k個結點的右單支樹需要2k-1個結點存儲空間。依據二叉樹的性質,完全二叉樹和滿二叉樹採用順序存儲比較合適,樹中結點的序號可以唯一地反映出結點之間的邏輯關系,這樣既能夠最大可能地節省存儲空間,又可以利用數組元素的下標值確定結點在二叉樹中的位置,以及結點之間的關系。圖5-5(a)是一棵完全二叉樹,圖5-5(b)給出的圖5-5(a)所示的完全二叉樹的順序存儲結構。

(a) 一棵完全二叉樹 (b) 順序存儲結構
圖5-5 完全二叉樹的順序存儲示意圖
對於一般的二叉樹,如果仍按從上至下和從左到右的順序將樹中的結點順序存儲在一維數組中,則數組元素下標之間的關系不能夠反映二叉樹中結點之間的邏輯關系,只有增添一些並不存在的空結點,使之成為一棵完全二叉樹的形式,然後再用一維數組順序存儲。如圖5-6給出了一棵一般二叉樹改造後的完全二叉樹形態和其順序存儲狀態示意圖。顯然,這種存儲對於需增加許多空結點才能將一棵二叉樹改造成為一棵完全二叉樹的存儲時,會造成空間的大量浪費,不宜用順序存儲結構。最壞的情況是右單支樹,如圖5-7 所示,一棵深度為k的右單支樹,只有k個結點,卻需分配2k-1個存儲單元。

(a) 一棵二叉樹 (b) 改造後的完全二叉樹

(c) 改造後完全二叉樹順序存儲狀態
圖5-6 一般二叉樹及其順序存儲示意圖

(a) 一棵右單支二叉樹 (b) 改造後的右單支樹對應的完全二叉樹

(c) 單支樹改造後完全二叉樹的順序存儲狀態
圖5-7 右單支二叉樹及其順序存儲示意圖
結構5-1二叉樹的順序存儲

#define Maxsize 100 //假設一維數組最多存放100個元素
typedef char Datatype; //假設二叉樹元素的數據類型為字元
typedef struct
{ Datatype bt[Maxsize];
int btnum;
}Btseq;

2.鏈式存儲結構
二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。
通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址。其結點結構為:

其中,data域存放某結點的數據信息;lchild與rchild分別存放指向左孩子和右孩子的指針,當左孩子或右孩子不存在時,相應指針域值為空(用符號∧或NULL表示)。利用這樣的結點結構表示的二叉樹的鏈式存儲結構被稱為二叉鏈表,如圖5-8所示。

(a) 一棵二叉樹 (b) 二叉鏈表存儲結構
圖5-8 二叉樹的二叉鏈表表示示意圖
為了方便訪問某結點的雙親,還可以給鏈表結點增加一個雙親欄位parent,用來指向其雙親結點。每個結點由四個域組成,其結點結構為:

這種存儲結構既便於查找孩子結點,又便於查找雙親結點;但是,相對於二叉鏈表存儲結構而言,它增加了空間開銷。利用這樣的結點結構表示的二叉樹的鏈式存儲結構被稱為三叉鏈表。
圖5-9給出了圖5-8 (a)所示的一棵二叉樹的三叉鏈表表示。

圖5-9二叉樹的三叉鏈表表示示意圖
盡管在二叉鏈表中無法由結點直接找到其雙親,但由於二叉鏈表結構靈活,操作方便,對於一般情況的二叉樹,甚至比順序存儲結構還節省空間。因此,二叉鏈表是最常用的二叉樹存儲方式。
結構5-2二叉樹的鏈式存儲
#define datatype char //定義二叉樹元素的數據類型為字元
typedef struct node //定義結點由數據域,左右指針組成
{ Datatype data;
struct node *lchild,*rchild;
}Bitree;

c語言編程 關於順序存儲與鏈式存儲

<p></p>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct
node
{
int
data;
node
*next;
};
node
*create(int
a[],int
len)
{
int
i;
node
*head=new
node;
head->data=a[0];
node
*p=head;
node
*q;
for(i=1;i<len;i++)
{
q=new
node;
q->data=a[i];
p->next=q;
p=q;
}
p->next=NULL;
return
head;
}
node
*
insert(node
*head,int
k)
{
node
*temp=new
node;
temp->data=k;
temp->next=head;
head=temp;
return
head;
}
node
*dele(node
*head,int
m)
{
int
i;
node
*p=head;
node
*x=new
node;
node
*y=new
node;
if(m==1)
{
node
*q=head;
head=head->next;
free(q);
}
else
{
for(i=1;i<m;i++)
{
x=p;
p=p->next;
y=p->next;
}
x->next=y;
free(p);
}
return
head;
}
void
main()
{
int
a[10]={1,2,3,4,5,6,7,8,9,10};
int
len=10;
node
*head=new
node;
head=create(a,len);
node
*p=head;
printf("原數組為:");
while(p!=NULL)
{
printf("%d
",p->data);
p=p->next;
}
printf("\n輸入要插入的元素:");
int
k;
scanf("%d",&k);
head=insert(head,k);
p=head;
printf("增加元素後的數組為:");
while(p!=NULL)
{
printf("%d
",p->data);
p=p->next;
}
printf("\n要刪除的元素位置為:");
int
m;
scanf("%d",&m);
head=dele(head,m);
p=head;
printf("刪除元素後的數組為:");
while(p!=NULL)
{
printf("%d
",p->data);
p=p->next;
}
}<p>此處為鏈表實現的方式,鏈表的好處在於內存不必連續,並且順序存儲
</p>
<p>順序存儲結構的特點是:連續的內存,隨機存儲。</p>

⑤ 順序存儲方式的優點是存儲密度大,且插入,刪除運算效率高對嗎

順序存儲方式的有點是密度大,而插入,刪除運算效率高是鏈表的優點。

⑥ 棧的順序存儲和鏈表存儲的差異

順序存儲: 線性表的順序表:指的是用一組地址連續的存儲單元,依次存儲線性表的數據元素。
線性表的順序存儲結構具備如下兩個基本特徵: 1、線性表中的所有元素所佔的存儲空間是連續的(即要求內存中可用存儲單元的地址必須是連續的)。 2、線性表中各數據元素在存儲空間中是按邏輯順序依次存放的。 即:線性表邏輯上相鄰、物理也相鄰(邏輯與物理統一:相鄰數據元素的存放地址也相鄰),則已知第一個元素首地址和每個元素所佔位元組數,則可求出任一個元素首地址。 優點: 1、
無須為表示結點間的邏輯關系而增加額外的存儲空間。
2、
可以方便的隨機存取表中的任一結點。
3、
存儲密度大(=1),存儲空間利用率高。 缺點: 1、
插入和刪除運算不方便,需移動大量元素。 2、
由於要求佔用連續的存儲空間,存儲分配只能按最大存儲空間預先進行,致使存儲空間不能得到充分利用。
3、
表的容量難以擴充。 鏈表存儲: 線性表的鏈式存儲:指用一組任意的存儲單元存儲線性表中的數據元素。
線性表的鏈式存儲結構具備的基本特徵: 鏈式存儲時,相鄰數據元素可隨意存放,但所佔存儲空間分兩部分,一部分存放結點值,另一部分存放表示結點間關系的指針。 優點: 1、
插入、刪除操作很方便,可通過修改結點的指針實現,無須移動元素。
2、
方便擴充存儲空間。
缺點: 1、
不能隨機存取元素。
2、
存儲密度小(<1),存儲空間利用率低。 總結: 1、
順序表適宜於做查找這樣的靜態操作;
鏈表宜於做插入、刪除這樣的動態操作。 2、若線性表的長度變化不大,且其主要操作是查找,則採用順序表; 若線性表的長度變化較大,且其主要操作是插入、刪除操作,則採用鏈表。

⑦ 存儲器可分為哪三類

存儲器不僅可以分為三類。因為按照不同的劃分方法,存儲器可分為不同種類。常見的分類方法如下。

一、按存儲介質劃分

1. 半導體存儲器:用半導體器件組成的存儲器。

2. 磁表面存儲器:用磁性材料做成的存儲器。

二、按存儲方式劃分

1. 隨機存儲器:任何存儲單元的內容都能被隨機存取,且存取時間和存儲單元的物理位置無關。

2. 順序存儲器:只能按某種順序來存取,存取時間和存儲單元的物理位置有關。

三、按讀寫功能劃分

1. 只讀存儲器(ROM):存儲的內容是固定不變的,只能讀出而不能寫入的半導體存儲器。

2. 隨機讀寫存儲器(RAM):既能讀出又能寫入的存儲器。

二、選用各種存儲器,一般遵循的選擇如下:

1、內部存儲器與外部存儲器

一般而言,內部存儲器的性價比最高但靈活性最低,因此用戶必須確定對存儲的需求將來是否會增長,以及是否有某種途徑可以升級到代碼空間更大的微控制器。基於成本考慮,用戶通常選擇能滿足應用要求的存儲器容量最小的微控制器。

2、引導存儲器

在較大的微控制器系統或基於處理器的系統中,用戶可以利用引導代碼進行初始化。應用本身通常決定了是否需要引導代碼,以及是否需要專門的引導存儲器。

3、配置存儲器

對於現場可編程門陣列(FPGA)或片上系統(SoC),可以使用存儲器來存儲配置信息。這種存儲器必須是非易失性EPROM、EEPROM或快閃記憶體。大多數情況下,FPGA採用SPI介面,但一些較老的器件仍採用FPGA串列介面。

4、程序存儲器

所有帶處理器的系統都採用程序存儲器,但是用戶必須決定這個存儲器是位於處理器內部還是外部。在做出了這個決策之後,用戶才能進一步確定存儲器的容量和類型。

5、數據存儲器

與程序存儲器類似,數據存儲器可以位於微控制器內部,或者是外部器件,但這兩種情況存在一些差別。有時微控制器內部包含SRAM(易失性)和EEPROM(非易失)兩種數據存儲器,但有時不包含內部EEPROM,在這種情況下,當需要存儲大量數據時,用戶可以選擇外部的串列EEPROM或串列快閃記憶體器件。

6、易失性和非易失性存儲器

存儲器可分成易失性存儲器或者非易失性存儲器,前者在斷電後將丟失數據,而後者在斷電後仍可保持數據。用戶有時將易失性存儲器與後備電池一起使用,使其表現猶如非易失性器件,但這可能比簡單地使用非易失性存儲器更加昂貴。

7、串列存儲器和並行存儲器

對於較大的應用系統,微控制器通常沒有足夠大的內部存儲器。這時必須使用外部存儲器,因為外部定址匯流排通常是並行的,外部的程序存儲器和數據存儲器也將是並行的。

8、EEPROM與快閃記憶體

存儲器技術的成熟使得RAM和ROM之間的界限變得很模糊,如今有一些類型的存儲器(比如EEPROM和快閃記憶體)組合了兩者的特性。這些器件像RAM一樣進行讀寫,並像ROM一樣在斷電時保持數據,它們都可電擦除且可編程,但各自有它們優缺點。

參考資料來源:網路——存儲器

⑧ 簡述棧和隊列的順序存儲結構和鏈式存儲結構的優缺點

順序棧--入棧操作受數組上界的約束有可能發生棧上溢,且需要地址連續的存儲單元。
鏈棧--無須地址連續,便於多個棧共享存儲單元,且不存在棧滿上溢情況。
順序隊列--需地址連續且有假上溢現象(需改為循環隊列才可解決假上溢)
鏈式隊列--特別適合於數據元素變動比較大的情況,且不存在隊列滿而產生的溢出問題。

⑨ 順序存儲方式串的基本操作是什麼

1.串聯結concat串聯結concat函數是用T返回由S1和S2聯結而成的新串。由於串長固定,因此超過串長的串值必須捨去,稱為「截斷」。假設S1、S2和T都是SString型的串變數,且串T是由串S1聯結得到的,即串T的值的前一段和串S1的值相等,串T的值的後一段和串S2的值相等,則只要進行相應的「串值復制」操作即可,只是需要約定,對超長部分實施「截斷」操作。基於串S1和S2長度的不同情況,串T值的產生可能有2種情況:①S1[0]+S2[0]≤MAXSTRLEN時,得到串T的正確結果;②S1[0]<MAXSTRLEN,而S1[0]+S2[0]>MAXSTRLEN時,則將串S2的一部分截斷,得到的串T只包含S2的一個子串;③S1[0]=MAXSTRLEN時,則得到的串T並非聯結結果,而和串S1相等。在這里僅考慮能正確聯結的情況,即S1[0]+S2[0]<MAXSTRLEN,

⑩ 什麼是順序存儲器

按存儲方式分

隨機存儲器:任何存儲單元的內容都能被隨機存取,且存取時間和存儲單元的物理位置無關。

順序存儲器:只能按某種順序來存取,存取時間和存儲單元的物理位置有關。

熱點內容
java工程師面試問題 發布:2024-11-16 09:28:36 瀏覽:233
用什麼引擎導出的安卓安裝包不大 發布:2024-11-16 09:09:06 瀏覽:474
安卓手機如何設置轉接 發布:2024-11-16 09:08:55 瀏覽:423
sql行業 發布:2024-11-16 09:04:07 瀏覽:295
如何查看電腦硬碟的介面速率緩存 發布:2024-11-16 08:59:42 瀏覽:221
c語言局部變數與全局變數 發布:2024-11-16 08:37:38 瀏覽:489
安卓蘋果是什麼意思啊 發布:2024-11-16 08:36:03 瀏覽:872
泛型方法編譯 發布:2024-11-16 08:36:01 瀏覽:875
造夢西遊記的密碼和用戶名是什麼 發布:2024-11-16 08:30:22 瀏覽:339
cmake編譯zlib出錯 發布:2024-11-16 08:26:32 瀏覽:442