單鏈表的整表創(chuàng)建
1、順序存儲結(jié)構(gòu)的創(chuàng)建,其實就是一個數(shù)組的初始化,即聲明一個固定類型和大小的數(shù)組并賦值的過程。
而單鏈表和順序存儲結(jié)構(gòu)就不一樣,它不像順序存儲結(jié)構(gòu)那么幾種,它可以很散,是一種動態(tài)結(jié)構(gòu)。對于每個鏈表來說,
它所占用空間的大小和位置是不需要預先分配劃定的,可以根據(jù)系統(tǒng)的情況和實際需求即時生成。
所以創(chuàng)建單鏈表的過程就是一個動態(tài)生成鏈表的過程。即從“空表”的初始狀態(tài)起,依次建立各元素結(jié)點,并逐個插入鏈表。
---- 單鏈表整表創(chuàng)建的算法思路:
-- 1)聲明一結(jié)點p和計數(shù)器變量 i ;
-- 2)初始化一空鏈表L;
-- 3)讓L的頭結(jié)點的指針指向NULL,即建立一個帶頭結(jié)點的單鏈表;
-- 4)循環(huán):生成一新結(jié)點賦值給p ? ? 隨機生成一數(shù)字賦值給p的數(shù)據(jù)域p->data ? 將p插入到頭結(jié)點與前一新結(jié)點之間。
實現(xiàn)代碼算法如下:
#include#includeusing?namespace?std; typedef?int?Elemtype;? typedef?struct?node { Elemtype?data; struct?node?*link; }?Node,*LinkList; //typedef?struct?node?*LinkList; //typedef?Node?*LinkList; /*?隨機產(chǎn)生n個元素的值,建立帶表頭結(jié)點的單鏈線性表L(頭插法)*/ void?CreateList(LinkList?*L,int?n) { LinkList?p; int?i; srand((unsigned)time(0));?//初始化隨機數(shù)種子 *L?=?(LinkList)malloc(sizeof(Node)); (*L)->link?=?NULL;??//先建立一個帶頭結(jié)點的單鏈表 for(i=0;idata?=?rand()%100+1; //隨機生成100以內(nèi)的數(shù)字 p->link?=?(*L)->link; //指向第一個結(jié)點 (*L)->link?=?p; //插入到表頭 } }
這段算法代碼里,我們其實用的是插隊的辦法,就是始終讓新結(jié)點在第一的位置??梢园堰@種算法簡稱為頭插法。
也可以每次把新結(jié)點都插在終端結(jié)點的后面,按照排隊時的正常思維,所謂的先來后到,這種算法稱之為尾插法。
實現(xiàn)代碼算法如下:
#include#includeusing?namespace?std; typedef?int?Elemtype;? typedef?struct?node { Elemtype?data; struct?node?*link; }?Node,*LinkList; //typedef?struct?node?*LinkList; //typedef?Node?*LinkList; /*?隨機產(chǎn)生n個元素的值,建立帶表頭結(jié)點的單鏈線性表L(尾插法)*/ void?CreateList(LinkList?*L,int?n) { LinkList?p,r; int?i; srand((unsigned)time(0));?//初始化隨機數(shù)種子 *L?=?(LinkList)malloc(sizeof(Node)); r?=?*L; //r為指向尾部的結(jié)點 for(i=0;idata?=?rand()%100+1; //隨機生成100以內(nèi)的數(shù)字 r->link?=?p; //將表尾終端結(jié)點的指針指向新結(jié)點 r?=?p; //將當前的新結(jié)點定義為表尾終端結(jié)點 } r->link?=?NULL; }
L是指整個單鏈表,而 r 是指向尾結(jié)點的指針,r是會隨著循環(huán)不斷的變化,L則是隨著循環(huán)增長為一個多結(jié)點的鏈表。