1. 程式人生 > >C 資料結構迴圈連結串列(帶環連結串列)基本操作

C 資料結構迴圈連結串列(帶環連結串列)基本操作

經典迴圈連結串列之約瑟夫問題:標號從1到n的n個人圍成一個圈,從1開始計數到m的人退出圈子,然後從退出的下一個人開始接著從1計數,數到m的人後繼續退出,最後只剩下一個人,求剩下人的編號。這便是約瑟夫問題的模型。

經典迴圈連結串列之魔術師發牌問題:魔術師手中有A、2、3……J、Q、K十三張黑桃撲克牌。在表演魔術前,魔術師已經將他們按照一定的順序疊放好(有花色的一面朝下)。魔術表演過程為:一開始,魔術師數1,然後把最上面的那張牌翻過來,是黑桃A;然後將其放到桌面上;第二次,魔術師數1、2;將第一張牌放到這些牌的最下面,將第二張牌翻轉過來,正好是黑桃2;第三次,魔術師數1、2、3;將第1、2張牌依次放到這些牌的最下面,將第三張牌翻過來正好是黑桃3;……直到將所有的牌都翻出來為止。問原來牌的順序是如何的。

連結串列相交

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//定義單向迴圈連結串列結點
typedef struct cNode{
    int data;
    struct cNode* next;
}cnode;

cnode* create_cNode(const int length){
    cnode* head = (cnode*)malloc(sizeof(cnode));
    cnode* p = head;
    for(int i=0;i<length;i++){
        p->next = (cnode*)malloc(sizeof(cnode));
        p->next->data = i+1;
        p=p->next;        
    }
    p->next = head->next;
    return head;
}

//列印所有結點
void print_cNode(cnode* cNode){
    cnode* p = cNode->next;
    while(p->next!=cNode->next){
        printf("%d\n",p->data);
        p=p->next;
    }    
    printf("%d\n",p->data);
}

//判斷一個連結串列是否帶環
//思路:設定一個快指標一次走2步,一個慢指標一次走1步,如果快指標與慢指標相遇則帶環
int with_loop_or_not(cnode* cNode){
    if(cNode==NULL){
        return 0;
    }
    cnode* fast = cNode->next;
    cnode* slow = cNode;
    while(fast!=slow && fast->next!=NULL&&fast->next->next!=NULL){
        fast = fast->next->next;
        slow = slow-next;
    }
    if(fast==slow){
        return 1;
    }
    else{
        return 0;
    }
}

//尋找帶環連結串列的入口
//思路: 對於帶環連結串列,從求出的相遇點挨個向下走,
//另一個指標從頭結點挨個向下走,兩個指標相遇的地方就是環入口

cnode* loop_enter(cnode* cNode){
    //先求出快慢指標在環內的相遇點
    if(cNode==NULL){
        return 0;
    }
    cnode* fast = cNode->next;
    cnode* slow = cNode;
    while(fast!=slow && fast->next!=NULL&&fast->next->next!=NULL){
        fast = fast->next->next;
        slow = slow-next;
    }
    //求入口
    cnode* step = head;
    cnode* loop_step = fast;
    while(step!=loop_step){
        step=step->next;
        loop_step=loop_step->next;
    }
    return step; //入口點
}

//判斷連結串列是否相交
//相交的意思是兩個連結串列的尾部若干個結點是重合的。
//方法一:分別求兩個連結串列的尾指標, 若兩個尾指標相等則相交。
//方法二:把其中一個連結串列的首尾相連,在此基礎上,若第二個連結串列存在環,則兩個連結串列相交

//約瑟夫問題
void ysf(cnode* cNode,int n, int m){
    cnode* p=cNode;    
    while(p->next!=p){
        int k = 1;
        if(k!=m){
            p=p->next;
            k+=1;
        }
        cnode* s = p->next;
        p->next = s->next;
        free(s);        
        }
    printf("%d\n",p->data);    
}

//魔術師發牌問題
cnode* mss(int length){
    cnode* head = (cnode*)malloc(sizeof(cnode));
    cnode* p = head;
    for(int i=0;i<length;i++){
        p->next = (cnode*)malloc(sizeof(cnode));
        p->next->data = 0;
        p=p->next;        
    }
    p->next = head->next;


    p = head->next;
    p->data = 1;
    for(int num = 2;num<=13;num++){
        int i = 0;
        while(i<num){
            p = p->next;
            if(p->data==0){
                i++;
            }
        }
        p->data = num;
    }
    return head;
}

void main(){
    //cnode* cNode = create_cNode(41);
    cnode* mms_ = mss(13);
    print_cNode(mms_);
    //ysf(cNode,41,3);
    return ;
}

相關推薦

C 資料結構迴圈連結串列連結串列基本操作

經典迴圈連結串列之約瑟夫問題:標號從1到n的n個人圍成一個圈,從1開始計數到m的人退出圈子,然後從退出的下一個人開始接著從1計數,數到m的人後繼續退出,最後只剩下一個人,求剩下人的編號。這便是約瑟夫問題的模型。 經典迴圈連結串列之魔術師發牌問題:魔術師手中有A、2、3……J

C++資料結構4 二分查詢遞迴方法

二分查詢比順序查詢效率高很多 同樣的100萬個資料,順序查詢需要50萬次,而二分查詢需要20次左右既可以了。但是二分查詢需要的資料是已經排列好的,無序的資料則用不了二分查詢。 #include &l

[LintCode] Linked List Cycle連結串列

描述 給定一個連結串列,判斷它是否有環。 樣例 給出 -21->10->4->5, tail connects to node index 1,返回 true。 這裡解釋下,題目的意思,在英文原題中,tail connects

資料結構之 AVL樹平衡二叉樹C語言實現

AVL樹(平衡二叉樹) 1. AVL樹定義和性質 AVL(Adelson-Velskii和Landis發明者的首字母)樹時帶有平衡條件的二叉查詢樹。 二叉查詢樹的效能分析: 在一顆左右子樹高度平衡情況下,最優的時間複雜度為O(log2n),這與這半

[C++]資料結構:散列表雜湊表、雜湊函式構造、處理雜湊衝突

        關鍵字{12,25, 38, 15, 16, 29, 78, 67, 56, 21, 22, 47 } , 對應後位置是 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}。 不過這種方法很容易產生衝突(如果關鍵字餘數大部分相同)。一般地,散列表長為m, 通常p

資料結構——圖整理程式碼鄰接表儲存圖

資料結構圖相關程式碼整理記錄——鄰接表儲存圖 環境CodeBlocks17 執行通過 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <queue> usi

Java資料結構之 AVL樹平衡二叉樹簡析

AVL(即平衡二叉樹)樹是帶有平衡條件的二叉查詢樹(二叉查詢樹即左孩子小於根節點,右孩子大於根節點的二叉樹)。一顆AVL樹是其每個節點的左子樹和右子樹的高度最多差 1 的二叉查詢樹(空樹的高度定為-1),只有一個節點的樹高度為0。在高度為h的AVL樹中,最少節點數S(h)=S

淺談資料結構中的樹B/B+/B-/B*

一、B樹(二叉搜尋樹) 1、所有非葉子節點至多擁有兩個兒子。 2、所有節點儲存一個關鍵字。 3、左孩子小於父節點,右孩子大於父節點。 二、B-樹(多路搜尋樹)1、定義任意多個非葉子節點最多隻有M個孩子 2、根節點的兒子數【2,M】 3、除根節點之外的非葉子節點的孩子數

資料結構----希爾排序最小增量排序

1.基本思想:演算法現將要排序的一組數按某個增量d(n/2,n為要排序數的個數) 分成若干組,每組中記錄的下標相差d。對每組中全部元素進行直接插入排序,然後再用一個較小的增量(d/2)對它進行分組,在每組中在進行直接插入排序。當增量減到1時,進行直接插入排序,排

資料結構系列——字尾樹附Java實現程式碼

字尾樹,說的通俗點就是將一個字串所有的字尾按照字首樹(Trie樹,可參考此篇文章)的形式組織成一棵樹。 什麼是字尾樹 舉例:“banana\0”,其中 “\0” 作為文字結束符號,該字串所有的字尾如下: banana\0 anana\0 na

[資料結構]Hash表初學開放定址法

/* Name:Hash表初學 (陣列實現連結串列 開放定址法 ) Actor:HT Time:2015年9月29日 Error Reporte: */ #include"stdio.h"

資料結構實驗七 圖深度優先遍歷

一、 實驗目的 1. 熟悉圖的鄰接矩陣和鄰接表的儲存結構 2. 熟悉圖的鄰接矩陣和鄰接表的建立演算法 3. 掌握圖的遍歷演算法 二、 實驗內容 1. 無向圖採用鄰接矩陣儲存,編寫深

資料結構:多項式加法map的簡單應用

1:多項式加法 描述     我們經常遇到兩多項式相加的情況,在這裡,我們就需要用程式來模擬實現把兩個多項式相加到一起。首先,我們會有兩個多項式,每個多項式是獨立的一行,每個多項式由係數、冪數這樣的多個整數對來表示。 如多項式2x20- x17+ 5x9- 7x7+ 1

資料結構實驗之棧與佇列八:棧的基本操作

Problem Description 堆疊是一種基本的資料結構。堆疊具有兩種基本操作方式,push 和 pop。push一個值會將其壓入棧頂,而 pop 則會將棧頂的值彈出。現在我們就來驗證一下堆疊的

資料結構實驗之棧與佇列八:棧的基本操作(new)

#include <stdio.h> #include <stdlib.h> typedef struct node { int *base; int *top; int stacksize; } sqstack;

資料結構】雜湊表及雜湊桶的基本操作

  順序搜尋和二叉搜尋樹中,元素儲存位置和元素各關鍵碼之間沒有對應的關係,這就導致在查詢一個元素時,必須經過關鍵碼的多次比較。那麼是否有這樣一種資料結構,可以不經過任何比較,直接找到想要搜尋的元素呢?答案是肯定的,那就是通過某種函式(hashFunc)使得元素的儲存位置與它的

C++資料結構與STL--雙向迴圈連結串列實現自定義iterator類

class dLinkList {private:node<T> *head;  //頭節點size_t length; //連結串列長度void dInsert(node<T> *curr,T val)  //插入的輔助函式,把新節點插入curr前 {node<T>* t

C# 資料結構 -------------------------- 泛型帶頭節點的單鏈表,雙向連結串列實現

在程式設計領域,資料結構與演算法向來都是提升程式設計能力的重點。而一般常見的資料結構是連結串列,棧,佇列,樹等。事實上C#也已經封裝好了這些資料結構,在標頭檔案 System.Collections.Generic 中,直接建立並呼叫其成員方法就行。不過我們學習當然要知其然,亦知其所以然。 本文實現的是連結

資料結構】單鏈表無頭單向非迴圈連結串列各個介面的實現

順序表存在的問題: 中間/頭部的插入刪除,時間複雜度為O(N) 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗 增容一般是呈2倍的增長,勢必會有一定的空間浪費。 例如當前容量為100,滿了以後增容到200,如果再繼續插入了5個數據,後面沒有資料插入了,

C語言資料結構----迴圈連結串列

主要講解釋迴圈連結串列的一些定義和具體的操作。 一、基本定義: 1.單鏈表的侷限:不可以迴圈。2.迴圈連結串列的定義:將單鏈表中最後一個元素的next指向第一個元素。3.迴圈連結串列擁有單鏈表的所有操作。4.迴圈連結串列的插入和單鏈表插入的差別:單鏈表的插入是 n