數據結構與算法學習筆記02_3(線性表)

數據結構與算法學習筆記02_3(線性表)

 

單鏈表的整表創建

單鏈表整表創建的算法思路如下:

創建單鏈表的過程是一個動態生成鏈表的過程,從“空表”的初始狀態起,依次建立各元素結點並逐個插入鏈表。

所以單鏈表整表創建的算法思路如下:

聲明一結點p和計數器變量i;

初始化一空鏈表L;

讓L的頭結點的指針指向NULL,即建立一個帶頭結點的單鏈表;

循環實現後繼結點的賦值和插入。

 

頭插法建立單鏈表

頭插法從一個空表開始,生成新結點,讀取數據存放到新結點的數據域中,然後將新結點插入到當前鏈表的表頭上,直到結束爲止。

簡單來說,就是把新加進的元素放在表頭後的第一個位置:

先讓新節點的next指向頭節點之後

然後讓表頭的next指向新節點

 

void createListHead(LinkList *L, int n){
	LinkList p;
	int i;

	srand(time(0));//初始化隨機種子
	*L = (LinkList)malloc(sizeof(Node));
	(*L)->next = NULL;

	for (i = 0; i < n;i++)
	{
		p = (LinkList)malloc(sizeof(Node));
		p->data = rand() % 100 + 1;
		p->next = (*L)->next;
		(*L)->next = p;
	}
}
 

尾插法建立單鏈表

void createListTail(LinkList *L, int n){
	LinkList p ,r;
	int i;

	srand(time(0));//初始化隨機種子
	*L = (LinkList)malloc(sizeof(Node));
	r = *L;

	for (i = 0; i < n;i++)
	{
		p = (LinkList)malloc(sizeof(Node));
		p->data = rand() % 100 + 1;
		r->next = p;
		r = p;
	}
	r->next = NULL;
}

單鏈表的整表刪除

單鏈表整表刪除的算法思路如下:

聲明結點p和q;

將第一個結點賦值給p,下一結點賦值給q;

循環執行釋放p和將q賦值給p的操作;

Status ClearList(LinkList *L){
	LinkList p, q;
	p = (*L)->next;

	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*L)->next = NULL;
	return Ok;
}

結論:

若線性表需要頻繁查找,很少進行插入和刪除操作時,宜採用順序存儲結構。

若需要頻繁插入和刪除時,宜採用單鏈表結構。

比如說遊戲開發中,對於用戶註冊的個人信息,除了註冊時插入數據外,絕大多數情況都是讀取,所以應該考慮用順序存儲結構。

而遊戲中的玩家的武器或者裝備列表,隨着玩家的遊戲過程中,可能會隨時增加或刪除,此時再用順序存儲就不太合適了,單鏈表結構就可以大展拳腳了。

當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣可以不需要考慮存儲空間的大小問題。

而如果事先知道線性表的大致長度,比如一年12個月,一週就是星期一至星期日共七天,這種用順序存儲結構效率會高很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章