C 演算法總結 2

2021-08-16 02:01:58 字數 1532 閱讀 2720

c++演算法在普通鍊錶中的應用也是非常多的,現在我將常見的鍊錶操作演算法總結下,示例如下:

1.刪除鍊錶中指定值為value的所有值

void deletefromlist( node *phead, int value )  

else

} }

2.在鍊錶index位置插入新的值value

void insertfromlist( node *phead, int index, int value )    

3.鍊錶逆序的簡單演算法實現

node* invertedfromlist( node *phead )    

phead->mpnext = nullptr;//c->b->a->null

return pprev; //return c( new head )

}

4.判斷鍊錶是否有環

bool isloop( node *phead )  

} return false;

}

5.判斷鍊錶是否相交**自部落格:

問題描述:

乙個比較經典的問題,判斷兩個鍊錶是否相交,如果相交找出他們的交點。

思路:1、碰到這個問題,第一印象是採用hash來判斷,將兩個鍊錶的節點進行hash,然後判斷出節點,這種想法當然是可以的。

2、當然採用暴力的方法也是可以的,遍歷兩個鍊錶,在遍歷的過程中進行比較,看節點是否相同。

3、第三種思路是比較奇特的,在程式設計之美上看到的。先遍歷第乙個鍊錶到他的尾部,然後將尾部的next指標指向第二個鍊錶(尾部指標的next本來指向的是null)。這樣兩個鍊錶就合成了乙個鍊錶,判斷原來的兩個鍊錶是否相交也就轉變成了判斷新的鍊錶是否有環的問題了:即判斷單鏈表是否有環?

這樣進行轉換後就可以從鍊錶頭部進行判斷了,其實並不用。通過簡單的了解我們就很容易知道,如果新煉表是有環的,那麼原來第二個鍊錶的頭部一定在環上。因此我們就可以從第二個鍊錶的頭部進行遍歷的,從而減少了時間複雜度(減少的時間複雜度是第乙個鍊錶的長度)。

下圖是乙個簡單的演示:

這種方法可以判斷兩個鍊錶是否相交,但不太容易找出他們的交點。

4、仔細研究兩個鍊錶,如果他們相交的話,那麼他們最後的乙個節點一定是相同的,否則是不相交的。因此判斷兩個鍊錶是否相交就很簡單了,分別遍歷到兩個鍊錶的尾部,然後判斷他們是否相同,如果相同,則相交;否則不相交。示意圖如下:

判斷出兩個鍊錶相交後就是判斷他們的交點了。假設第乙個鍊錶長度為len1,第二個問len2,然後找出長度較長的,讓長度較長的鍊錶指標向後移動|len1 - len2| (len1-len2的絕對值),然後在開始遍歷兩個鍊錶,判斷節點是否相同即可。

下面給出乙個簡單的實現:

typedef struct node_t

node;

node* find_node(node *head1, node *head2)

通過上面的操作就可以找到兩個鍊錶的交點了。

串匹配演算法總結2

該演算法主要利用壞字元規則和好字尾規則進行轉換。所謂壞字元規則,是指不能匹配時的字元在待匹配字串中從右邊數的位置 而好字尾規則則是指子串中從該不匹配位置後面所有字元 都是已匹配字元 再次在字串 現的位置 k 其中s k,k 1,k len j 1 s j 1,j 1,len 1 並且s k 1 j ...

c 知識總結(2)

記憶體分配有三種方式 一 從全域性儲存區域分配 這時內存在程式編譯階段就已經分配好,該內存在程式執行的整個週期都有效,如 全域性變數 static靜態變數。二 從棧區分配 在執行函式的時候,函式中的區域性變數的儲存單元都可以從棧中分配,函式執行結束後這些儲存單元都會被自動釋放,實現從棧中分配儲存單元...

C 題目總結2

1.在c語言中 typedef struct st newst不是乙個結構體型別,struct st才是完整的型別名,new也是型別名 2.過載的基本條件,引數型別不同,引數個數不同。返回值型別不同並不構成過載。3.不能在初始化時使用連等 4.scanf是不允許指定精度的,但是可以指定長度。5.c ...