還記得資料結構這個經典的分類圖吧:
今天主要關注一下線性表。
線性表的劃分是從資料的邏輯結構上進行的。線性指的是在資料的邏輯結構上是線性的。即在資料元素的非空有限集中
(1) 存在唯一的乙個被稱作「第乙個」的資料元素,(2) 存在唯一的乙個被稱作「最後乙個」的資料元素,(3) 除第乙個外,集合中的每個資料元素均只有乙個前繼元素,(4)除最後乙個外,集合中的每個資料元素均只有乙個後繼元素。
那麼對於線性表,從儲存結構上分,可以有順序儲存結構和鏈式儲存結構。順序儲存結構包括順序表、順序佇列和順序棧;鏈式儲存結構包括鍊錶、鏈佇列和鏈棧。所有這些分類資料結構的實現,後續的博文將陸續進行介紹。
順序表的結構如下圖所示:
從結構上可以看出,順序表實際上就是乙個動態陣列,在c++的標準模板庫(stl)中類似的對應著vector模板類。所以理解順序表對於使用vector進行高階應用的開發有著極為重要的作用。
儲存結構定義如下:
typedef struct
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_nmax=n;
l->m_nsize=0;
}void freelist(seqlist *l)
void insert(seqlist *l,datatype item,int pos)
if(pos<=0||pos>l->m_nsize)
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
string;
基本運算: concat(), substring(), insert(),delete(),clear()…
一種特殊的線性表:只能在表的一端插入,另一端刪除,是先進先出的線性表;頭指標(刪除位置)和尾指標(插入位置)
first come, first serve(fifo)
優點:迴圈結構、刪除時不需移動元素
順序佇列的結構如下圖所示:
儲存結構定義如下:
typedef struct
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)
item=q->m_pdata[q->m_nfront];
q->m_nfront=(q->m_nfront+1)%q->m_nmax;
q->m_nsize--; }
一種特殊的線性表:只能在表的一端插入和刪除,是後進先出的線性表;進棧和出棧
結構如下圖所示:
順序棧的基本操作如下:
cstack()/cstack(int n); // 建構函式
~cstack(); // 析構函式
int setsize(int n); // 設定棧的大小
int free(); // 釋放空間
int size(); // 棧的大小
int empty(); // 判斷是否空
int full(); // 判斷是否滿
int push(datatype item); // 壓棧
datatype pop(); // 出棧
datatype getpeek(); // 取棧頂元素
int clear(); // 清空棧
順序棧的基本運算函式宣告如下:
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);
線性表順序儲存和鏈式儲存
輸入第1行是乙個整數n,表示之後還有n行輸入。每行輸入表示對線性表的一條操作指令,格式是 指令編號 引數1 引數2 如有 指令編號為3,表示find操作,此時只有乙個引數,即待查元素的值。順序儲存 include using namespace std const int maxn 1e4 1 st...
線性表之順序儲存結構和鏈式儲存結構
一 順序儲存結構 線性表幾種基本操作的思路 1 插入演算法 1 插入位置不合理,丟擲異常 2 線性表長度超過 陣列長度,丟擲異常或者是動態增加陣列容量 效率會變低 3 從最後乙個元素向前遍歷到第i個位置,分別將它們後移一位。4 將要插入的元素插入在i處 5 線性表長度要 1 2 刪除演算法 1 刪除...
線性表之順序儲存結構和鏈式儲存結構
線性表包括順序表和煉表,其中鍊錶又包括單鏈表 迴圈鍊錶 雙向鍊錶。順序儲存結構和鏈式儲存結構有所不同,具體區別如下表所示 線性表是一種邏輯結構,相同資料型別的n個資料元素的有限序列,除第乙個元素外,每個元素有且僅有乙個直接前驅,除最後乙個元素外,每個元素有且僅有乙個直接後繼。線性表的特點 元素個數有...