線性表的鏈式儲存即形成鍊錶。在鏈式儲存結構中,每個儲存結點不僅包含所存元素本身的資訊即資料域,還包含元素之間的邏輯關係,即前驅結點包含有後繼結點的位址信
息,這就是指標域.從而提高資料的查詢速度。
頭結點的引入是為了插入和刪除的方便。通過頭結點指標唯一標識乙個鍊錶。
單鏈表:形式如下
linklist型別的定義如下:
typedef struct lnode /*定義單鏈表結點型別*/
linklist, *plinklist;--------------------結點型別
單鏈表基本運算的實現:
(1)建立單鏈表:常用兩種方法頭插法和尾插法。
①頭插法建表:該方法從乙個空表開始,讀取字元陣列a中的字元,生成新結點,將讀取的資料存放到新結點的資料域中,然後將新結點插入到當前鍊錶的表頭上,直到結束為止。採用 頭
插法建表的演算法如下:
void creatlistf(linklist *&l, elemtype a, int n)
}採用頭插法建立鍊錶的的過程如下:
②尾插法建表:頭插法建表雖簡單,但建立的鍊錶順序和原陣列的順序相反。若想生成的次序一致,可採用尾插法建表。即將新結點插到鍊錶的表尾上,為此必須增加乙個尾指
針,使其始終指向當前鍊錶的尾結點。採用尾插法建表的演算法如下:
void creatlistr(linklist *&l, elemtype a, int n)
linklist *s, *r, int i;
l = (linklist*) malloc (sizeof(linklist));/* 建立頭結點 */
r= l; /* r始終指向終端結點,開始時指向頭結點 */
for(i= 0; i < n; i++)
r->next = null;/* 終端結點next域值為null */
尾插法建立鍊錶的過程如下:
(2)單鏈表插入結點運算:將值為x的新結點插入到單鏈表的第i個結點的位置上。鍊錶的插入也分為向前、向後插入兩種形式。
單鏈表的插入演算法實現如下(先在單鏈表中找到第i -1 個結點*p,若存在這樣的結點,將值為e的結點*s插入到其後):
int listinsert(linklist *&l, int i, elemtype e)
int j = 0;
linklist *p = l, *s;
while (j < i - 1 && p != null )/* 查詢第i - 1個結點 */
if(p == null)
else
**如下:
linklist * insert (linklist* head, int num)
linklist *p0,*p1,*p2;
p1 = head;
p0 = (linklist*)malloc(sizeof(linklist));
p0->data = num;
while(p0->data > p1->data && p1->next != null)
if (p0->data <= p1->data)
else
else
p1->next = p0;
p0->next = null;
return (head);
(3)單鏈表的刪除結點運算:先在單鏈表中找到第i-1個結點*p,若存在這樣的結點,且存在後繼結點,則刪除該後繼結點。
演算法如下:
int listdelete (linklist *&l, int i, elemtype &e)
int j = 0;
linklist *p = l;
linklist *q;
while(j < i - 1 && p != null) /* 查詢第i - 1個結點 */
if(p == null) /* 未找到邏輯位序為i -1 結點 */
else /* 找到邏輯位序為i -1 結點 */
else
}**如下:
linklist* del(linklist * head ,int num)
if (num == p1->data)
else
}else
return head;
(4)單鏈表排序:
演算法如下:
①void sort(linklist *&l)}}
②linklist *sort (linklist *head)
linklist *p, *p2, *p3;
int n;
int temp;
n = length(head);
if(head == null ||head->next == null)
return head;
p = head;
for(int j = 1; j < n; j++)
p = p->next;}}
return head;
(5)單鏈表逆置:
①:利用輔助指標
linklist *reverse (linklist *head)
linklist *p1,*p2,*p3;
if(head == null || head->next == null)
p1 = head;
p2 = head->next;
while(p2)
②:遞迴
void reverse (linklist * pcur, linklist *& listhead)
if((null == pcur) || (null == pcur->next))
else
linklist* reverse (linklist* pcur, linklist *& listhead)
if ((null == pcur) || (null == pcur->next))
else
(6)單鏈表在不知道長度的情況下,求中間節點:設立兩個指標,乙個每次移動兩個位置,乙個每次移動乙個位置,當前者到達最後乙個結點時,後者就是中間節點。
演算法如下:void searchmid(node * head,node*mid)
node *temp = head;
while (head->next->next != null)
(7)單鏈表初始化:
linklist linklistinit()
linklist head;
head = (lnode*)malloc(sizeof(lnode));
if(null == head)
head->next = null;
head->data = 0;
return head;
/* 建立單鏈表,增加元素 */
bool linklist_creat(linklist* head,elemtype e)
linklist* temp;
temp = head;
while(temp->next != null)
temp->next = (lnode*)malloc(sizeof(lnode));
temp->next->next = null;
head->data++;
return 0;
資料結構 鍊錶 單鏈表
陣列作為資料儲存結構有一定缺陷。無序陣列搜尋低效,有序陣列插入低效 無論哪種陣列,刪除低效 大小固定,無法所以改變。但是陣列的優勢是通過下標隨機訪問各個資料。鍊錶可以取代陣列作為儲存資料的基礎,比如棧,佇列。鍊錶分類 單鏈表 雙端鍊錶 有序鍊錶 雙向鍊錶 有迭代器的鍊錶 迭代器是用來隨機訪問鍊錶元素...
資料結構 鍊錶(單鏈表)
頭指標與頭結點不同,頭結點即第乙個結點,頭指標是指向第乙個結點的指標。鍊錶中可以沒有頭結點,但不能沒有頭指標。include using namespace std struct node node int d class list void insert int d void print node...
資料結構 鍊錶,單鏈表篇
概述 線性表的鏈式儲存結構稱為鍊錶,其中每個節點不僅包含元素本身資訊,而且包含標識元素之間的邏輯關係的資訊,在c c 中常用指標來實現,這稱為指標域。順序表中邏輯上相鄰元素對應的儲存位置也相鄰,所以執行插入刪除操作時候平均需要移動半個表的元素,而鍊錶不同,邏輯上相鄰元素對應的儲存位置不一定相鄰,它是...