『壹』 鏈式存儲隊列的數據結構(邏輯結構+存儲結構)分析、鏈式存儲隊列的基本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);
}
}
幫你轉的,我覺得他描述的很清楚。希望對你有幫助。
『貳』 單鏈表的存儲密度是多少
單鏈表的存儲密度是:
假設單鏈表數據元素本身的存儲量為N,指針域所佔的存儲量為M,則存儲密度為:N/(N+M)。
存儲密度越大,空間利用率越高,顯然順序表的存儲密度為1,如果單純的從存儲密度來講,鏈表的這種存儲方式是不經濟的,基於此,如線性表的長度變化不大,易於事先確定其大小時,為了節約存儲空間,宜採用順序表作為存儲結構。
單鏈表
單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。鏈表中的數據是以結點來表示的,每個結點的構成:元素數據元素的映象指針指示後繼元素存儲位置。
元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。以「結點的序列」表示線性表稱作線性鏈表(單鏈表),單鏈表是鏈式存取的結構。
『叄』 急求.......用鏈式存儲結構定義一個單鏈表的數據結構程序...............
/*這個程序實現了鏈表的創建、插入、刪除和輸出等功能,是我數據結構上機實驗做的,編譯環境是VC++6.0*/
#include <malloc.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Lnode{
ElemType data;
struct Lnode *next;
}Lnode;
typedef Lnode *LinkList;
//初始化鏈表
Status InitList(LinkList &L)
{ Lnode *p;
p=(Lnode *)malloc(sizeof(Lnode));
if(p==NULL) return ERROR;
L=p;
L->next=NULL;
return OK;
}
//創建鏈表
Status CreatList(LinkList &L)
{ int i,len;
ElemType x;
LinkList p,q;
printf("input list length:");
scanf("%d",&len);
printf("\ninput list data:\n");
i=0; q=L;
while(i<len)
{ p=(Lnode *)malloc(sizeof(Lnode));
scanf("%d",&x);
p->data=x;
q->next=p;
q=p;
i++;
}
q->next=NULL;
return OK;
}
//獲取鏈表長度
int ListLength(LinkList L)
{ int len=0;
LinkList p;
p=L->next;
while(p)
{ len++;
p=p->next;}
return (len);
}
//取鏈表中的元素
Status GetList(LinkList L,int i,ElemType &e)
{ int j;
LinkList p;
if(i<1) return ERROR;
j=0;
p=L;
while(p->next!=NULL&&j<i)
{ p=p->next;
j++;}
if(j==i) {e=p->data; return OK;}
return ERROR;
}
//插入數據
Status InsertList(LinkList &L,int i,ElemType e)
{ int j;
LinkList p,q;
if(i<1) return ERROR;
j=0;
p=L;
while(p->next!=NULL&&j<i-1)
{ p=p->next;
j++;}
if(j==i-1)
{ q=(Lnode *)malloc(sizeof(Lnode));
q->data=e;
q->next=p->next;
p->next=q;
return OK;}
return ERROR;
}
//刪除數據
Status DeleteList(LinkList &L,int i,ElemType &e)
{ int j;
LinkList p,q;
if(i<1) return ERROR;
j=0;
p=L;
while(p->next!=NULL&&j<i-1)
{ p=p->next;
j++;}
if(p->next==NULL)
{ return ERROR;}
else
{ q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;}
}
//輸出鏈表
void PrintList(LinkList L)
{
LinkList p;
p=L->next;
printf("鏈表中的元素為:");
while(p){
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
void main()
{
ElemType i,e;
LinkList L;
InitList(L);
CreatList(L);
printf("輸入要取元素的位置:");
scanf("%d",&i);
GetList(L,i,e);
printf("第%d個位置的元素是:%d\n",i,e);
printf("輸入要插入元素的位置及元素值:");
scanf("%d%d",&i,&e);
InsertList(L,i,e);
printf("已插入元素%d在第%d個位置!\n",e,i);
PrintList(L);
printf("輸入要刪除的位置:");
scanf("%d",&i);
DeleteList(L,i,e);
printf("已刪除第%d個元素的位置%d!\n",i,e);
PrintList(L);
}
如果有不明白的可以問我,我QQ是975336234,最好是郵件的方式。
請採納!
『肆』 單鏈表存儲結構的C語言定義是具體是指什麼
數據的存儲方式有兩種,順序存儲和鏈式存儲,當然單鏈表也是鏈式存儲中的一種,單鏈表存儲結構的c語言定義應該是用c語言去描述一個單鏈表。
『伍』 數據結構|單鏈表表示的三種方法
對於線性表來說, 總得有個頭尾,頭部做為基準地址,如數組的數組名,鏈表的頭指針。尾部做為結束的標志,數組使用一個長度屬性來標識數組的結束位置,字元串使用轉義字元'',鏈表使用NULL指針來標識結束位置。
我們知道,數組的全部元素是集中存儲,數組的基準地址是第一個元素的地址,也就是數組名的值,其它元素的索引都是一個整型常量,對元素的訪問就是基準地址相對於索引的偏移,所以數組元素可以隨機訪問。
鏈式存儲是分散存儲,通過節點的指針域來建立一個節點與其下一個鄰接節點的聯系。鏈式存儲的頭指針雖然也是整個鏈式數據結構的基準地址,但要找到某一節點,需要順序訪問,從頭節點開始,順著每一個節點的指針域的值,一個節點一個節點地挼。
我們把鏈表中第一個節點的存儲位置叫做 頭指針 , 那麼整個鏈表的存取就必須是從頭指針開始進行了。之後的每一個節點, 其實就是上一個的後繼指針指向的位置。有時,我們為了更加方便地對鏈表進行操作,會在單鏈表的第一個結點前附設一個結點,稱為 頭節點 。頭節點的數據域可以不存儲任何信息,誰叫它是第一個呢,有這個特權。也可以存儲如線性表的長度等附加信息,頭節點的指針域存儲指向第一個節點的指針。
是否使用頭節點,在實現鏈表的常用操作時代碼的寫法稍有區別,使用頭節點的方法代碼較為簡潔。同時,也可以將這個表頭節點指針封裝到一個結構體中,並在結構體中增加鏈表長度等信息。
1 使用頭節點的鏈表表示
加頭結點的優點:
1)鏈表第一個位置的操作無需特殊處理;
2)將空表和非空表的處理統一。
2 不使用頭節點的鏈表表示
3 鏈表和鏈表節點用不同的結構體來表示
鏈表用一個結構體來描述,封裝一個節點指針做表頭,並增加一個鏈表長度變數,需要時也可以增加一個節點指針做表尾。
-End-
『陸』 二叉樹的鏈式存儲結構的數據結構定義、創建、先序和後序遍歷,並將結果序列輸出。
1、建立一個單鏈表,並從屏幕顯示單鏈表元素列表。
2、從鍵盤輸入一個數,查找在以上創建的單鏈表中是否存在該數;如果存在,顯示它的位置;如果不存在,給出相應提示。
3、在上述的單鏈表中的指定位置插入指定的元素
4、刪除上述單鏈表中指定位置的元素。
源程序:頭文件
#include<iostream.h>
#include<malloc.h>
typedef char ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;
void about(){ //版本信息
cout<<"單鏈表的操作"
}
void showmenu(){ //功能列表
cout<<endl <<" **********功能**********"<<endl
<<" * 1.輸出單鏈表的全部數據*"<<endl
<<" * 2.查找鏈表元素 *"<<endl
<<" * 3.鏈表插入元素 *"<<endl
<<" * 4.鏈表刪除元素 *"<<endl
<<" * 5.結束 *"<<endl
<<" ************************"<<endl
<<"請輸入所需功能: ";
}
//*******查看輸入的全部數據*********
void PrintList(LinkList L){
LinkList p;
cout<<endl<<"你輸入的數據為: ";
p=L->next; //從頭結點開始掃描
while(p){ //順指針向後掃描,直到p->next為NULL或i=j為止
cout<<p->data;
p=p->next; }
cout<<endl; }
//逆序輸入 n 個數據元素,建立帶頭結點的單鏈表
void CreateList_L(LinkList &L, int n) {
int i;
LinkList p;
L = new LNode;
L->next = NULL; // 先建立一個帶頭結點的單鏈表
cout<<"逆序輸入 n 個數據元素,建立帶頭結點的單鏈表"<<endl;
for (i = n; i > 0; --i) {
p = new LNode;
cin>>p->data; // 輸入元素值
p->next = L->next; L->next = p; // 插入
}
}
// L是帶頭結點的鏈表的頭指針,以 e 返回第 i 個元素
Status GetElem_L(LinkList L, int i, ElemType &e) {
int j;
LinkList p;
p = L->next; j = 1; // p指向第一個結點,j為計數器
while (p && j<i) { p = p->next; ++j; } // 順指針向後查找,直到 p 指向第 i 個元素或 p 為空
if ( !p || j>i )
return ERROR; // 第 i 個元素不存在
e = p->data; // 取得第 i 個元素
return OK;
}
// 本演算法在鏈表中第i 個結點之前插入新的元素 e
Status ListInsert_L(LinkList L, int i, ElemType e) {
int j;
LinkList p,s;
p = L; j = 0;
while (p && j < i-1)
{ p = p->next; ++j; } // 尋找第 i-1 個結點
if (!p || j > i-1)
return ERROR; // i 大於表長或者小於1
s = new LNode; // 生成新結點
if ( s == NULL) return ERROR;
s->data = e;
s->next = p->next; p->next = s; // 插入
return OK;
}
Status ListDelete_L(LinkList L, int i, ElemType &e)
{LinkList p,q;
int j;
p = L; j = 0;
while (p->next && j < i-1) { p = p->next; ++j; }
// 尋找第 i 個結點,並令 p 指向其前趨
if (!(p->next) || j > i-1)
return ERROR; // 刪除位置不合理
q = p->next; p->next = q->next; // 刪除並釋放結點
e = q->data; free(q);
return OK;
}
#include"LinkList.h"
void main()
{LinkList L;
int n,choice,i;
ElemType e;
about();
cout<<"請輸入鏈表中元素的個數";
cin>>n;
CreateList_L(L, n);
showmenu(); //功能列表
cin>>choice;
while(choice!=5)
{ //輸入時候退出程序
switch(choice){
case 1:PrintList(L);break; //1.查看輸入的全部數據
case 2:{
cout<<"輸入你要查找的元素的位置: ";
cin>>i;GetElem_L(L, i, e);
cout<<"第"<<i<<"個元素的值是"<<e<<endl;
break;} //2.查找鏈表元素
case 3:
{cout<<"請輸入你要插入元素的位置i: ";
cin>>i;
cout<<endl<<"請輸入你要插入元素的值: ";
cin>>e;
ListInsert_L(L, i,e);
break;} //3.鏈表插入元素
case 4:
{cout<<"請輸入你要刪除元素的位置";
cin>>i;
ListDelete_L(L, i, e) ;
break;} //4.鏈表刪除元素
default:cout<<"輸入錯誤,請輸入-5,輸入重顯示功能表^_^ "<<endl;
}
cout<<endl<<"輸入功能序號:";
cin>>choice;
}
}
『柒』 線性表順序存儲結構和鏈式存儲結構的定義,以及各自的有缺點,分別適合於哪些應用
定義
順序存儲結構就是用一組地址連續的存儲單元依次存儲該線性表中的各個元素。由於表中各個元素具有相同的屬性,所以佔用的存儲空間相同。
線性表按鏈式存儲時,每個數據元素 (結點)的存儲包括數據區和指針區兩個部分。數據區存放結點本身的數據,指針區存放其後繼元素的地址只要知道該線性表的起始地址表中的各個元素就可通過其間的鏈接關系逐步找到
優缺點
順序存儲需要開辟一個定長的空間,讀寫速度快,缺點不可擴充容量(如果要擴充需要開辟一個新的足夠大的空間把原來的數據重寫進去)
鏈式存儲無需擔心容量問題,讀寫速度相對慢些,由於要存儲下一個數據的地址所以需要的存儲空間比順序存儲大。
『捌』 線性表的鏈式存儲結構定義及基本操作
是這個效果嗎