線性表包括順序儲存結構和鏈式儲存結構
還記得資料結構這個經典的分類圖吧:
今天主要關注一下線性表。
什麼是線性表
線性表的劃分是從資料的邏輯結構上進行的。線性指的是在資料的邏輯結構上是線性的。即在資料元素的非空有限集中
(1) 存在唯一的一個被稱作“第一個”的資料元素,(2) 存在唯一的一個被稱作“最後一個”的資料元素,(3) 除第一個外,集合中的每個資料元素均只有一個前繼元素,(4)除最後一個外,集合中的每個資料元素均只有一個後繼元素。 那麼對於線性表,從儲存結構上分,可以有順序儲存結構和鏈式儲存結構。順序儲存結構包括順序表、順序佇列和順序棧;鏈式儲存結構包括連結串列、鏈佇列和鏈棧。所有這些分類資料結構的實現,後續的博文將陸續進行介紹。順序表(陣列,向量)
順序表的結構:
順序表的結構如下圖所示:從結構上可以看出,順序表實際上就是一個動態陣列,在C++的標準模板庫(STL)中類似的對應著vector模板類。所以理解順序表對於使用vector進行高階應用的開發有著極為重要的作用。 儲存結構定義如下:
typedef struct
{
DataType *m_pData;
int m_nMax,m_nSize;
}SeqList;
typedef int DataType;
順序表的基本操作及其實現
有了資料的結構定義,就必須有對應的方法實現從來進行相關的操作,基本的運算函式如下: Void SetList(SeqList *L,int n);// 建構函式,建立陣列長是n的空表Void FreeList(SeqList *L); // 解構函式,釋放陣列空間
int ListSize(SeqList *L) // 求表的長度
int IsEmpty(SeqList *L); // 判斷陣列是否空,1:空,0滿
int IfFull(SeqList *L); // 判斷陣列是否滿
DataType GetData(int pos); // 獲取陣列某元素
int Locate(SeqList *L,DataTypeitem); // 判斷元素位置
Void SetData(SeqList *L,DataTypeitem,int pos); //元素位置賦值
Void Insert(SeqList *L,int pos,DataType item); //
void InsertRear(SeqList *L,DataType&item); // 在末尾插入元素
void Delete(SeqList *L,int pos);//刪除某位置元素
void ClearList(SeqList *L); // 清表,表中的元素個數是0;
Void DeleteBetween(SeqList *L,intstart, int end)
對應某些函式方法的實現如下:voidSetList(SeqList *L,int n)
{
L->m_pData=newDataType[n];
if(L->m_pData==NULL)
{
cout<<”overflow”<<endl;exit(1);
}
L->m_nMax=n;
L->m_nSize=0;
}
Void FreeList(SeqList *L)
{
delete [ ]L->m_pData;
L->m_nSize=0;
L->m_nMax=0;
}
void Insert(SeqList *L,DataType item,int pos)
{
//在順序表中在pos處插入item
i=1;
if(L->m_nSize==L->m_nMax){printf(“SeqListis FULL\n”);exit(1)}
if(pos<=0||pos>L->m_nSize)
{
printf(“Pos is out of range”);exit(1);
}
for(i=L->m_nSize-1;i>=pos;i--)
L->m_nData[i+1]=L->m_nData[i];
L->m_nData[pos]=item;
L->m_nSize++;
}
順序表的應用:動態字串
C語言字串char str[13]=“Hello, world!”;
char *pStr = str;
字串函式gets(char *str);
puts(char *str);
strcpy(char *str1, char *str2); //字串拷貝
strcat(char *str1, char *str2); //字串連線,str1必須足夠大
strcmp(char *str1, char *str2); //字串比較
strlen(char *str); //字串求長,不包含’\0’的長度
動態字串:
Typedef struct{
int m_nSize;//不含結束符的長度
char*m_pStr;
}String;
基本運算: Concat(), SubString(), Insert(),Delete(),Clear()…順序佇列
一種特殊的線性表:只能在表的一端插入,另一端刪除,是先進先出的線性表;頭指標(刪除位置)和尾指標(插入位置) First come, first serve(FIFO) 優點:迴圈結構、刪除時不需移動元素順序佇列的結構:
順序佇列的結構如下圖所示:儲存結構定義如下: typedef struct
{
DataType *m_pData;
int m_nMax;
int m_nFront,m_nRear, m_nSize;
}Queue;
順序佇列的基本操作及其實現
Void SetQueue(Queue *Q,int n); // 建構函式 void FreeQueue(Queun *Q); // 解構函式 int QSize(Queue *Q); // 佇列長度 int QEmpty(Queue *Q); // 判斷佇列是否空 int QFull(Queue *Q); // 判斷佇列是否滿 DataType QGetData(Queue *Q); // 獲取資料 int QInsert(Queue *Q,DataType item); // 進佇列 DataType QDelete(Queue *Q); // 出佇列 void QClear(); // 清空 佇列刪除操作:DataTypeQDelete(Queue *Q)
{
DataType item;
if(Q->m_nSize==0)
{
printf(“佇列空\n”);
Exit(1);
}
item=Q->m_pData[Q->m_nFront];
Q->m_nFront=(Q->m_nFront+1)%Q->m_nMax;
Q->m_nSize--;
}順序棧
一種特殊的線性表:只能在表的一端插入和刪除,是後進先出的線性表;進棧和出棧順序棧的結構:
結構如下圖所示:Typedef struct
{
DataType *m_pData;
int m_nMax;
int m_nTop;//插入資料的位置,空為-1,入棧+1,出棧-1
}Stack;