数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...
還記得數(shù)據(jù)結(jié)構(gòu)這個(gè)經(jīng)典的分類(lèi)圖吧:
今天主要關(guān)注一下線性表。
什么是線性表
線性表的劃分是從數(shù)據(jù)的邏輯結(jié)構(gòu)上進(jìn)行的。線性指的是在數(shù)據(jù)的邏輯結(jié)構(gòu)上是線性的。即在數(shù)據(jù)元素的非空有限集中
(1)?存在唯一的一個(gè)被稱(chēng)作“第一個(gè)”的數(shù)據(jù)元素,(2)?存在唯一的一個(gè)被稱(chēng)作“最后一個(gè)”的數(shù)據(jù)元素,(3)?除第一個(gè)外,集合中的每個(gè)數(shù)據(jù)元素均只有一個(gè)前繼元素,(4)除最后一個(gè)外,集合中的每個(gè)數(shù)據(jù)元素均只有一個(gè)后繼元素。那么對(duì)于線性表,從存儲(chǔ)結(jié)構(gòu)上分,可以有順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。順序存儲(chǔ)結(jié)構(gòu)包括順序表、順序隊(duì)列和順序棧;鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)包括鏈表、鏈隊(duì)列和鏈棧。所有這些分類(lèi)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),后續(xù)的博文將陸續(xù)進(jìn)行介紹。
順序表(數(shù)組,向量)
順序表的結(jié)構(gòu):
順序表的結(jié)構(gòu)如下圖所示:從結(jié)構(gòu)上可以看出,順序表實(shí)際上就是一個(gè)動(dòng)態(tài)數(shù)組,在C++的標(biāo)準(zhǔn)模板庫(kù)(STL)中類(lèi)似的對(duì)應(yīng)著vector模板類(lèi)。所以理解順序表對(duì)于使用vector進(jìn)行高級(jí)應(yīng)用的開(kāi)發(fā)有著極為重要的作用。 存儲(chǔ)結(jié)構(gòu)定義如下:
typedef struct
{
? DataType *m_pData;
? ? int m_nMax,m_nSize;
}SeqList;
typedef int DataType;
順序表的基本操作及其實(shí)現(xiàn)
有了數(shù)據(jù)的結(jié)構(gòu)定義,就必須有對(duì)應(yīng)的方法實(shí)現(xiàn)從來(lái)進(jìn)行相關(guān)的操作,基本的運(yùn)算函數(shù)如下:Void SetList(SeqList *L,int n);// 構(gòu)造函數(shù),建立數(shù)組長(zhǎng)是n的空表
Void FreeList(SeqList *L); // 析構(gòu)函數(shù),釋放數(shù)組空間
int ListSize(SeqList *L) // 求表的長(zhǎng)度
int IsEmpty(SeqList *L); // 判斷數(shù)組是否空,1:空,0滿
int IfFull(SeqList *L); // 判斷數(shù)組是否滿
DataType GetData(int pos); // 獲取數(shù)組某元素
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); // 清表,表中的元素個(gè)數(shù)是0;
Void DeleteBetween(SeqList *L,intstart, int end)
對(duì)應(yīng)某些函數(shù)方法的實(shí)現(xiàn)如下:
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++;
}
順序表的應(yīng)用:動(dòng)態(tài)字符串
C語(yǔ)言字符串
char str[13]=“Hello, world!”;
?char *pStr = str;
字符串函數(shù)?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); //字符串求長(zhǎng),不包含’\0’的長(zhǎng)度
動(dòng)態(tài)字符串:
Typedef struct
?{
? ?int m_nSize;//不含結(jié)束符的長(zhǎng)度
? ?char*m_pStr;
?}String;
基本運(yùn)算: Concat(), SubString(), Insert(),Delete(),Clear()…順序隊(duì)列
一種特殊的線性表:只能在表的一端插入,另一端刪除,是先進(jìn)先出的線性表;頭指針(刪除位置)和尾指針(插入位置) First come, first serve(FIFO) 優(yōu)點(diǎn):循環(huán)結(jié)構(gòu)、刪除時(shí)不需移動(dòng)元素順序隊(duì)列的結(jié)構(gòu):
順序隊(duì)列的結(jié)構(gòu)如下圖所示:存儲(chǔ)結(jié)構(gòu)定義如下: typedef struct
{
? DataType *m_pData;
? int m_nMax;
? int m_nFront,m_nRear, m_nSize;
}Queue;
順序隊(duì)列的基本操作及其實(shí)現(xiàn)
Void SetQueue(Queue *Q,int n); // 構(gòu)造函數(shù) void FreeQueue(Queun *Q); // 析構(gòu)函數(shù) int QSize(Queue *Q); // 隊(duì)列長(zhǎng)度 int QEmpty(Queue *Q); // 判斷隊(duì)列是否空 int QFull(Queue *Q); // 判斷隊(duì)列是否滿 DataType QGetData(Queue *Q); // 獲取數(shù)據(jù) int QInsert(Queue *Q,DataType item); // 進(jìn)隊(duì)列 DataType QDelete(Queue *Q); // 出隊(duì)列 void QClear(); // 清空 隊(duì)列刪除操作:DataTypeQDelete(Queue *Q)
{
? DataType item;
? if(Q->m_nSize==0)
? {
printf(“隊(duì)列空\(chéng)n”);
? ? Exit(1);
? }
? item=Q->m_pData[Q->m_nFront];
? Q->m_nFront=(Q->m_nFront+1)%Q->m_nMax;
? Q->m_nSize--;
}順序棧
一種特殊的線性表:只能在表的一端插入和刪除,是后進(jìn)先出的線性表;進(jìn)棧和出棧順序棧的結(jié)構(gòu):
結(jié)構(gòu)如下圖所示:
Typedef struct
{
? DataType *m_pData;
? int m_nMax;
? int m_nTop;//插入數(shù)據(jù)的位置,空為-1,入棧+1,出棧-1
}Stack;
順序棧的基本操作
順序棧的基本操作如下: CStack()/CStack(int n); // 構(gòu)造函數(shù) ~CStack(); // 析構(gòu)函數(shù) int SetSize(int n); // 設(shè)置棧的大小 int Free(); // 釋放空間 int Size(); // 棧的大小 int Empty(); // 判斷是否空 int Full(); // 判斷是否滿 int Push(DataType item); // 壓棧 DataType Pop(); // 出棧 DataType GetPeek(); // 取棧頂元素 int Clear(); // 清空棧 順序棧的基本運(yùn)算函數(shù)聲明如下: Void SetStack(Stack *S,int n); Void FreeStack(Stack *S); Int StackEmpty(Stack *S); Int StackFull(Stack *S); Void Push(Stack *S,DataType item); DataType Pop(Stack *S); Void ClearStack(Stack *S); DataType Peek(Stack *S);轉(zhuǎn)載于:https://www.cnblogs.com/huty/p/8519306.html
總結(jié)
以上是生活随笔為你收集整理的数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jboss eap 6.2+ 版本中 加
- 下一篇: bootbox显示中文的按钮