資料結構 迴圈鍊錶

2021-09-22 12:48:49 字數 2618 閱讀 5167

目錄

迴圈鍊錶

迴圈鍊錶與單鏈表的區別和聯絡

迴圈鍊錶的訪問順序

迴圈佇列的常用操作 排序

合併合併並保留序列 反轉

判空後續操作待補充

**實現

迴圈鍊錶和單鏈表最大區別就是最後乙個節點指向頭節點。遍歷時節點迭代指標 p!=頭節點 l就行了。

迴圈鍊錶也算是繼承自單鏈表,起到模擬環的效果。解決單鏈表無法首尾相連的弊端。故而,在結構上與單鏈表無異。

由於迴圈鍊錶起到模擬環的作用,所有訪問順序是乙個圈,即遍歷一次後能夠返回到頭節點。

除了增加、刪除、查詢、修改外,這裡再補充幾個操作。其實放在前面的單雙佇列也是有這些操作的,只是我沒有寫罷了。

常用操作 判空

清空鍊錶保留頭節點

合併多個鍊錶

排序合併後保持序列反轉

暫時只能想到這麼多,往後我再補充。

排序實際上在插入的過程中就可以完成。沒插入乙個節點,先找到這個節點應該放在哪個位置。這種不難。

難的是鍊錶賦值之後再排序。一種最常見的方法就是冒泡,這種時間複雜度比較高,達到o(n2),有沒有更快速的方法?

有的!o(nlogn)夠不夠,這種做法是

跑一遍鍊錶,把鍊錶裡面的數值取出來放入陣列,然後再跑一邊快排,然後再放回鍊錶就行了。於是我又想到第一篇文章裡面的單鏈表快排能不能做到?如果按照這個思路來,是可以的!

了解各種排序時間複雜度和空間複雜度戳這裡

這裡舉快速排序的例子吧,演算法時間複雜度高的咱不寫。

用到了malloc.h中的

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
使用這個函式之前需要知道節點數

int count(linklist l)

return i+1;

}

還要有乙個比較函式(這個函式如果是 「-」 表示公升序 「+」表示降序

int cmpfunc (const void * a, const void * b)

排序函式

linklist sort(linklist &l)

a[i] = p->value;

qsort(a,count,sizeof(int),cmpfunc);

p = l->next;

i = 0;

while(p->next != l)

p ->value = a[i];

return l;

}

有兩種合併方式:

建立乙個新的鍊錶,然後把所需要合併的鍊錶按次序賦值給新的鍊錶。

遍歷每個鍊錶找到對應的尾節點,然後將後者的頭節點與前者的尾節點相接

兩種方式的優缺點分析:

方法一保留了原來的鍊錶,但是建立了乙個新鍊錶,空間複雜度有所提高。

方法二破壞了原來的鍊錶,使得所有鍊錶合併成乙個鍊錶,空間上並沒有多大改變,甚至還可以釋放幾個鍊錶的頭節點。

//function18 王道考研資料結構 p39 t18,迴圈鍊錶合併

linklist combine(linklist &a,linklist &b)

while(q->next != b)

p->next = b->next;

q->next = a;

return a;

}

建立乙個新鍊錶,然後把每個鍊錶的資料都取出來,跑一遍排序,最後放入新鍊錶。

反轉也有兩種方法:

記錄一下頭節點,記錄一下尾節點,跑一遍迴圈鍊錶,使頭節點尾節點位置互換。時間複雜度o(n2)

用陣列把資料取出來,然後逆序放入鍊錶。時間複雜度o(nlogn)

這裡挑第二種方法跑了一遍**、

linklist reverse(linklist &l)

a[i] = p->value;

p = l->next;

while(p!=l)

return l;

}

對於迴圈鍊錶來說,判空等價於頭節點的next是否指向自己或者鍊錶記錄資料的節點數為0。

單鏈表就是記錄資料的節點數為0或者頭節點的next指向空

**只有一些常規操作,新增的一些操作會在後期補上。

#include#includetypedef struct cnodecnode,*linklist;

linklist initlist(linklist &l)

//乙個乙個插入資料

linklist insert(linklist &l)

q->next = p;

}void display(linklist l)

printf("\n");

return;

}int main()

//combine(a,b);

//display(a);

//emptyandfree(b);

display(b);

}

資料結構 迴圈鍊錶

近期我在學習資料結構,於是我自己整理了單鏈表 迴圈單鏈表 雙向鍊錶 雙向迴圈鍊錶的相關 以鞏固這段時間的學習,也希望能夠幫助初學者,希望大家在閱讀以下 時發現問題糾正於我,一起 cyclinklist.h ifndef cyclinklist h define cyclinklist h inclu...

資料結構 迴圈鍊錶

迴圈鍊錶的結點 typedef struct circularnodecircularnode 迴圈鍊錶結構 typedef struct circularlinklistcircularlinklist 在迴圈鍊錶的指定位置插入元素 void insertcircularlinklist circ...

資料結構 迴圈鍊錶

start reading 在知道熟悉單鏈表的操作後,我們知道鍊錶有乙個資料域存放具體的資料,有乙個next域存放後繼的位址,如果我們將尾結點的next域指向之前的任意乙個節點,那麼就形成了乙個環。下面我們就來說說迴圈鍊錶 如圖就是乙個迴圈鍊錶 在對迴圈鍊錶進行操作時要注意尾結點的後繼不是null,...