目錄
迴圈鍊錶
迴圈鍊錶與單鏈表的區別和聯絡
迴圈鍊錶的訪問順序
迴圈佇列的常用操作 排序
合併合併並保留序列 反轉
判空後續操作待補充
**實現
迴圈鍊錶和單鏈表最大區別就是最後乙個節點指向頭節點。遍歷時節點迭代指標 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,...