線性表是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...