鍊錶屬於線性結構之一,主要功能是提供可動態擴充套件的線性結構,可使用不連續的的記憶體空間,為程式的動態特性提供支援。邏輯結構如下(引用自csdn部落格)
一般的定義如下
/*the data structure of link list*/
typedef int datatype;
typedef struct linknode
*linklist;
其中data用於存放資料,*next指向下乙個結點,注意這個定義有遞迴的含義,因為*next的型別是linknode,這是在用自己定義自己,初學時也許會有點兒費解,但只要明白編譯器仍然將其理解為乙個指標就會清晰許多。下面給出鍊錶的基本演算法:(預設帶頭結點)/*尾插法建立鍊錶,鍊錶元素順序和陣列一致*/
void createlist(linklist &l,datatype a,int n)
rear->next = null;
}
/*頭插法建立鍊錶,鍊錶元素順序和陣列相反*/
void createlist_reverse(linklist &l,datatype a, int n)
}
/*鍊錶逆置演算法*/
void reverselist(linklist &l)
l->next = pre; /* l-next point to the head of the reversed list*/
}
/*刪除鍊錶中的元素x*/
void deletelist(linklist &l,datatype x)
}
/*插入鍊錶元素x*/
void insertlist(linklist &l ,datatype x)
/*顯示鍊錶所有元素,測試時比較有用*/
void displaylist(linklist &l)
cout
linknode *nextp = null; /*指向 p的後繼 結點 */
linknode *q = l; /*指向有序鍊錶的頭部*/
q->next = null;
while( p != null )
nextp = p->next;
p->next = q->next; /* p 的後繼應是 q */
q->next = p;
p = nextp;
}}
/*鍊錶查詢演算法*/
linknode *searchlist(linklist &l,datatype x)
return p;
}
/*鍊錶銷毀演算法*/
void destroylist(linklist &l)
{ if(l->next==null)
{ cout<
cout<
(1)熟悉輔助結點的使用,我們訪問鍊錶必須通過輔助結點, for( linknode *p=l; p!=null ; p=p->next ) 與 for( int i=0 ; i(2)熟悉操作通過前驅結點的方式,鍊錶的操作往往需要找到或者記錄當前結點的前驅,這也許是陌生感的真正原由。 所以鍊錶演算法中經常看到nextp,nextq,prep,preq這樣的輔助結點和p,q一起使用。
資料結構與演算法 鍊錶篇
反轉鍊錶這道演算法題應該算是所有鍊錶題的底層了,所以一定要理解掌握這道題 下面展示一些內聯 片。判斷鍊錶head或head.next是否為空,為空返回鍊錶head if head null head.next null 當前節點的前乙個節點 listnode pre null 當前節點 listno...
資料結構與演算法解析 鍊錶篇
鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域 對於雙向鍊錶也會儲存上乙個節點的位址...
資料結構 鍊錶篇
鍊錶的優點 插入和刪除速度快 記憶體利用率高 可以隨時擴充套件,不必擔心儲存滿 鍊錶的缺點 不能隨機查詢,只能通過從頭乙個乙個找,查詢效率低 實現如下 include include typedef struct node node 函式宣告 node head create list 頭插法建立鍊...