資料結構 線性表

2021-10-04 10:13:22 字數 4361 閱讀 9364

線性表是n個資料特性相同的元素的組成有限序列,是最基本且常用的一種線性結構(線性表,棧,佇列,串和陣列都是線性結構),同時也是其他資料結構的基礎。線性表有以下特點:

由0個或多個資料元素組成的有限序列

是乙個序列

第乙個無前驅,最後乙個無後續

元素有限

用一段位址連續的儲存單元依次儲存線性表的資料結構。順序儲存結構封裝的三個屬性

起始位置

最大儲存容量 maxsize

當前長度 length

順序表存和讀的時間複雜度為o(1),插入和刪除的時間複雜度為o(n)。關於時間複雜度請參考

關於順序表的優缺點:

優點:無需增加儲存空間

可以快速訪問表中任意元素

缺點:插入和刪除需要移動大量元素

當線性表長度較大時,難以確定儲存空間容量

容易造成空間「碎片」

有關順序表實現的功能,直接上**:

#include

using

namespace std;

#define maxsize 15

typedef

int datetype;

//struct 後面省略了定義的變數,因為重新命名為seqlist

//seqlist不是變數名,而是異種型別,相當於int,double

typedef

struct

seqlist;

seqlist *

init_seqlist()

;//初始化

void

define_seqlist

(seqlist *l,

int n)

;//填充順序表內容

void

display_seqlist

(seqlist *l)

;//提取順序表中元素

intinsert_seqlist

(seqlist *l,

int i, datetype x)

;//新增元素到指定位置(從開始)

intdelete_seqlist

(seqlist *l,

int i)

;//刪除指定位置元素(從指定位置開始)

//函式實現

seqlist *

init_seqlist()

void

define_seqlist

(seqlist *l,

int n)

}void

display_seqlist

(seqlist *l)

cout << endl;

}int

insert_seqlist

(seqlist *l,

int i, datetype x)

if(i<

1|| i>l-

>seqlength +1)

for(j = l-

>seqlength; j >= i; j--

) l-

>date[i]

= x;

l->seqlength++

; cout <<

"插入成功!"

<< endl;

display_seqlist

(l);

return1;

}int

delete_seqlist

(seqlist *l,

int i)

if(i <

1|| i >= l-

>seqlength +1)

for(j = i; j <= l-

>seqlength;j++

) l-

>seqlength--

; cout <<

"已刪除,結果為:"

<< endl;

display_seqlist

(l);

return1;

}int

main()

實踐結果如下:

順序儲存是將資料儲存在一段連續的空間中,這樣對資料的插入和刪除很不利,為了節約空間,我們可以使用鏈式儲存,方法是每個元素多用乙個位置儲存指向下乙個位置的指標,這樣可以從第乙個元素找到第二個元素,第二個元素可以找到第三個元素。

存資料元素資訊的域稱為資料域,把儲存直接候後繼位置稱為指標域,指標域中儲存的資訊稱為指標或鏈。兩部分加一起稱為結點。鍊錶第乙個結點的儲存位置叫頭指標,最後乙個結點的指標為空(null)。頭結點資料域不儲存資訊,頭指標是指鍊錶指向第乙個結點的指標。

若想在ai和ai+中插入s其中結點p由ai和p->next組成,結點s由e和s->next組成,結點s由e和s->next組成。所以只需要將

s->next=p->next;

p->next=s;

單鏈表第i個資料插入結點的演算法思路:

1、宣告一節點p指向煉表頭結點,初始化j從1開始;

2、當j<1時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下一節點,j累計加1;

3、若到鍊錶末尾p為空時,說明第i個元素不存在;

4、若查詢成功,系統中生成空節點s;

5、將資料元素e賦值給s->date;

6、兩個標準語句;

7、返回成功。

現有結點p:由a1和p->next組成 結點q:由a2和q->next組成 以及下乙個元素a3

若要刪除元素a2,則需要:

p->next=p->next->next;

或q=p->next;

p->next=q->next;

單鏈表第i個資料刪除結點的演算法思路:

1、宣告一節點p指向煉表頭結點,初始化j從1開始;

2、當j<1時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下一節點,j累計加1;

3、若到鍊錶末尾p為空時,說明第i個元素不存在;

4、若查詢成功,將欲刪除結點p->next賦值給q;

6、標準語句p->next=q->next;;

7、將q結點中的資料賦值給e,作為返回;

8、釋放q結點。

對於插入或刪除越頻繁的操作,單鏈表優勢越明顯。

單鏈表整表建立的演算法思路:

1、宣告一結點p和計數變數i;

2、初始化一空鍊錶l;

3、讓l的頭結點的指標指向null,即建立乙個帶頭結點的單鏈表;

4、迴圈實現後繼結點的賦值和插入。

方法有頭插法建立單鏈表以及尾插法建立單鏈表。

單鏈表基本操作**如下:

#include

using

namespace std;

typedef

int datetype;

typedef

struct lnode lnode;

//用尾插法建立鍊錶

lnode *

creat_tail

(int n)

l->next =

null

;//將最後乙個結點的指標域清空

return head;

//返回鍊錶的首位址

}//用頭插法建立鍊錶

lnode *

creat_head

(int n)

return head;

}//將鍊錶輸出

void

display_list

(lnode *h)

cout << endl;

}//將資料插入鍊錶

lnode *

insert_list

(lnode *list,

int num,

int insert_num)

p = p-

>next;

}return list;

}lnode *

delete_list

(lnode *list,

int num)

lnode *p,

*pn;

p = list;

pn =

null

;while

(p !=

null

)else

if(p-

>data==num)

}return list;

}int

main()

實踐結果如下:

資料結構(線性表)

1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...

資料結構 線性表

參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...

資料結構 線性表

線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...