鏈式存儲c
鏈式存儲結構的存讓返告儲空間在邏輯上是連續的,但是在物理上是離散的;而順序存儲結構的存儲空間在邏輯上是連續的,在物理上也是連續的。所以鏈式存儲結構可以將一些零碎的小空間鏈接起來組成邏輯上連續的空間,因此空間利用率較高;而順序存儲結世純構是佔用磁碟上一片連續的物理空間坦明,小於存儲要求的那些空間不能被使用,因此會跳過那些小存儲空間,然後尋找滿足要求的連續存儲空間,於是空間利用率就變低了。 但是存儲相同內容,順序存儲結構比鏈式存儲結構節省存儲空間。
B. 分別寫出線性表的鏈式存儲結構、二叉樹的二叉鏈表存儲機構的類C語言描述
線性表的鏈式存儲結構:
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
(被封裝好的每個節點,都有一個數據域data和一個指針域*next用於指向下一個節點)
二叉樹的二叉鏈表:
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
(被封裝好的每個節點,都有一個數據域data和兩個指針域 *lchild,*rchild分別指向左右子樹)
需要什麼類型的數據作為數據域可更改,或者typedef int ElemType;和typedef int TElemType;中的int,比如改為char、float等或者自定義數據類型。
C. c語言問題,什麼是無序線性表什麼是鏈式存儲結構
這是數據結構問題,無序線性表顧名思義就是裡面的元素是無序的一張線性表,就像數組,就是一種線性表,至於線性表的具體知識,建議自己去看一下數據結構,這樣更明白。
鏈式存儲結構跟線性存儲結構相對應。線性存儲結構是在連續的空間中存儲,可以實現順序的查找,鏈式存儲則可以實現在不連續的空間訪問存儲,使用指針就能實現了。
這兩個概念不是C語言問題,這是數據結構的知識,這是很重要的,建議你認真的學習下數據結構就明白了,這兩個概念是最基礎的概念!
D. C語言二級考試循環鏈表是循環隊列的鏈式存儲結構
循環隊列本身是一種順序存儲結構,而循環列表是一種鏈式存儲結構。兩者之間是平級關系。
線性鏈表是線性表的鏈式存儲結構,包括單鏈表,雙鏈表,循環鏈表等。
隊列的順序存儲結構一般採用循環隊列的形式。
循環隊列的操作是按數組取摸運算的,所以是順序存儲,而循環鏈表本身就是收尾相連的,所以循環鏈表不是循環隊列,兩種不同的存儲結構,雖然實現的功能是一樣的,實現循環兩種方式 順序存儲就是循環隊列,鏈式存儲就是循環鏈表。
(4)鏈式存儲c擴展閱讀:
1、比順序存儲結構的存儲密度小(鏈式存儲結構中每個結點都由數據域與指針域兩部分組成,相比順序存儲結構增加了存儲空間)。
2、邏輯上相鄰的節點物理上不必相鄰。
3、插入、刪除靈活 (不必移動節點,只要改變節點中的指針)。
4、查找節點時鏈式存儲要比順序存儲慢。
5、每個節點是由數據域和指針域組成。
6、由於簇是隨機分配的,這也使數據刪除後覆蓋幾率降低,恢復可能提高。
E. c語言線性表鏈式結構中如何存儲數據
對於LinkList L: L是指向定義的node結構體的指針,可以用->運算符來訪問結構體成員,即L->elem,而(*L)就是個Node型的結構體了,可以用點運算符訪問該結構體成員,即(*L).elem;
對於LinkList *L:L是指向定義的Node結構體指針的指針,所以(*L)是指向Node結構體的指針,可以用->運算符來訪問結構體成員,即(*L)->elem,當然,(**L)就是Node型結構體了,所以可以用點運算符來訪問結構體成員,即(**L).elem;
在鏈表操作中,我們常常要用鏈表變數作物函數的參數,這時,用LinkList L還是LinkList *L就很值得考慮深究了,一個用不好,函數就會出現邏輯錯誤,其准則是:
如果函數會改變指針L的值,而你希望函數結束調用後保存L的值,那你就要用LinkList *L,這樣,向函數傳遞的就是指針的地址,結束調用後,自然就可以去改變指針的值;
而如果函數只會修改指針所指向的內容,而不會更改指針的值,那麼用LinkList L就行了
F. 鏈式存儲隊列的數據結構(邏輯結構+存儲結構)分析、鏈式存儲隊列的基本C語言結構體分析與定義
鏈式隊列
鏈式存儲結構的隊列稱作鏈式隊列。
鏈式隊列的隊頭指針指在隊列的當前隊頭結點位置,隊尾指針指在隊列的當前隊尾結點位置。不帶頭結點的鏈式隊列時可直接刪除隊頭指針所指的結點。
鏈式隊列中結點的結構體可定義如下:
typedef struct qnode
{
DataType datal;
Struct qnode *next;
}LQNode;
為了方便參數調用,通常把鏈式隊列的隊頭指針front和隊尾指針rear也定義為如下的結構體類型LQueue:
typedef struct
{
LQNode *front;
LQNode *rear;
}LQueue;
鏈式隊列操作的實現
(1) 初始化QueueInitiate(LQueue *Q)
void QueueInitiate(LQueue *Q)
{
Q->rear=NULL;
Q->front=NULL;
}
(2)非空否QueueNotEmpty(LQueue Q)
int QueueNotEmpty(LQueue Q)
/*判斷鏈式隊列Q非空否,非空返回1,否則返回0*/
{
if(Q.front==NULL)return 0;
else return 1;
}
(3)入隊列QueueAppend(LQueue *Q,DataType x)
int QueueAppend(LQueue *Q,DataType x)
/*把數據元素x插入鏈式隊列Q隊列的隊尾,入隊列成功返回1,否則返回0*/
{
LQNode *p;
if((p=(LQNode*)malloc(sizeof(LQNode)))==NULL)
{
printf(「內存不足無法插入!\n);
return 0;
}
p->data=x;
p->next=NULL;
if(Q->rear!=NULL)Q->rear->next=p;
Q->rear=p;
if(Q->front==NULL)Q->front=p;
return 1;
}
(4)出隊列QueueDelete(LQueue *Q,DataType *d)
int QueueDelete(LQueue *Q,DataType *d)
/*刪除鏈式隊列Q的隊頭數據元素值到d,出隊列成功返回1,否則返回0*/
{
LQNode *p;
if(Q->front==NULL)
{
printf(「隊列已空無數據元素出隊列!\n」);
return 0;
}
else
{
*d=Q->front->data;
p=Q->front;
Q->front=Q->front->next;
if(Q->front==NULL)Q->rear=NULL;
free(p);
return 1;
}
}
(5)取隊頭數據元素QueueGet(LQueue *Q,DataType *d)
int QueueGet(LQueue *Q,DataType *d)
/*取鏈式隊列Q的當前隊頭數據元素值到d,成功返回1,否則返回0*/
{
if(Q.front==NULL)
{
printf(「隊列已空無數據元素出隊列!\n);
return 0;
}
else
{
*d=Q.front->data;
return 1;
}
}
(6)撤銷動態申請空間Destory(LQueue *head)
int Destory(LQueue *head)
{
LQNode *p,*p1;
p=Q.front;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}
幫你轉的,我覺得他描述的很清楚。希望對你有幫助。
G. 順序存儲結構和鏈式存儲結構都是c語言的知識嘛
你說的順序存儲和鏈式存儲都是數據結構的知識。其實這是一種思想,不僅可以用C語言實現,也可以用Java等其他語言實現的。
如果你要推薦教材,首推清華嚴蔚敏的《數據結構(C語言版)》,這是國人學習數據結構的入門課程,最適合中國人,0基礎也可以學的。
如果你想學高深點的。那就看老美的《演算法導論》。這個有些難度。
建議先看老嚴的書。
後來想想,還是給你做個鏈表吧:
/*鏈表方式模擬火車隧道*/
typedefintElemType;
typedefstructQNode{
ElemTypecarriage;/*車廂編號*/
structQNode*next;/*指針域,指向下一節車廂*/
}QNode,*QPtr;
typedefstruct{
QPtrfront;/*車頭(第一屆車廂)*/
QPtrrear;/*車尾(最後一節車廂)*/
}LinkQueue;
intIsEmpty(LinkQueueQ);/*判斷隧道是否為空*/
voidInitQueue(LinkQueue*pQ);/*火車開始進入隧道*/
voidDeQueue(LinkQueue*pQ);/*火車出隧道*/
voidPrtHeadTail(LinkQueueQ);/*列印第一節和最後一節車廂*/
#include<stdio.h>
#include<stdlib.h>
voidmain(void)
{
/*主函數中,上面那些功能函數你可以隨便調用。我這里調用順序只是為了測試。*/
LinkQueueQ;
/*先判斷隧道是否為空*/
if(IsEmpty(Q))printf("隧道為空! ");
elseprintf("隧道不空 ");
/*火車開始進入隧道*/
InitQueue(&Q);
/*在判斷隧道是否為空*/
if(IsEmpty(Q))printf("隧道為空! ");
elseprintf("隧道不空 ");
/*列印車頭車尾*/
PrtHeadTail(Q);
/*火車開出隧道*/
DeQueue(&Q);
}
intIsEmpty(LinkQueueQ)
{
if(Q.front==Q.rear){/*當火車頭==火車尾時,可知無車廂,即為空*/
return1;/*1表示空*/
}
elsereturn0;/*0表示非空*/
}
voidInitQueue(LinkQueue*Q)
{
intCarriageNum=-1;
intSerial=-1;
inti=0;
QPtrnewCarr;
Q->front=Q->rear=(QPtr)malloc(sizeof(QNode));/*生成一個火車頭*/
if(!Q->front)exit(-1);
Q->front->next=NULL;
printf("請輸入有車廂數量:");
scanf("%d",&CarriageNum);
for(;i<CarriageNum;i++)/*這個循環開始生成車廂,從第一節開始。*/
{
newCarr=(QPtr)malloc(sizeof(QNode));/*生成一節車廂*/
if(!newCarr)exit(-1);
printf("請輸入第%d節車廂編號:",i);
scanf("%d",&Serial);
newCarr->carriage=Serial;
newCarr->next=NULL;
Q->rear->next=newCarr;/*該車廂進入隧道*/
Q->rear=newCarr;
}
printf("列車已全部進入隧道! ");
}
voidDeQueue(LinkQueue*pQ)
{
QPtrp=NULL;
if(IsEmpty(*pQ))
{
printf("隧道為空! ");return;
}
while(!IsEmpty(*pQ))
{
p=pQ->front->next;
printf("%d",p->carriage);
pQ->front->next=p->next;
if(pQ->rear==p)
pQ->rear=pQ->front;
free(p);
}
printf("列車已全部駛出隧道! ");
}
voidPrtHeadTail(LinkQueueQ)
{
if(!IsEmpty(Q))
{
printf("第一節車廂序號為:%d ",Q.front->next->carriage);
printf("最後一節車廂序號為:%d ",Q.rear->carriage);
}
elseprintf("列車為空,沒有車廂編號! ");
}
-------------------------
經測試,程序基本無差錯,如有bug歡迎指正。
鏈式存儲要比結構數組存儲難一些。
我把鏈表的給你寫出來了,至於數組存儲的,你能自己寫么?