資料結構和演算法 鍊錶 單鏈表

2021-06-22 10:02:00 字數 3826 閱讀 2576

線性表的鏈式儲存即形成鍊錶。在鏈式儲存結構中,每個儲存結點不僅包含所存元素本身的資訊即資料域,還包含元素之間的邏輯關係,即前驅結點包含有後繼結點的位址信

息,這就是指標域.從而提高資料的查詢速度。

頭結點的引入是為了插入和刪除的方便。通過頭結點指標唯一標識乙個鍊錶。

單鏈表:形式如下

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 中常用指標來實現,這稱為指標域。順序表中邏輯上相鄰元素對應的儲存位置也相鄰,所以執行插入刪除操作時候平均需要移動半個表的元素,而鍊錶不同,邏輯上相鄰元素對應的儲存位置不一定相鄰,它是...