c語言集合除去相同元素,使用C語言去掉字符串集合重復元素

有一種最直接的方法可以去掉一個集合中重復的元素,這種方法據說就是“交給下面去做”,然而有時候,你自己動手去做一下也是不錯的。如果交給下面去做,最直接的選擇就是使用map,在java中,我們有HashMap,TreeMap等等實現了map接口的類可用,c++中,同樣有STL的同類集合可以使用,在各類高級語言中,就更不必說了,然而在c中,就沒有那么幸運了,很多東西需要你來自己實現。

根據《C語言內力修煉與軟件工程》,用c語言自行實現這個東西,其實對于軟件工程而言沒有必要,然而可以訓練一下自己,增加一些內力。我不認為自己是個高手,更非大俠,然而因為我懂得少,只能自己重新來做,真恨自己沒有在5年前多學習一些編程語言。

先來簡單分析一下需求,就是一個字符串集合中,去掉重復的字符串,換句話說就是每一個字符串只保留一個。題目沒有說是否保持原有的字符串輸入順序,作為完美主義的我,我還是將其當成了一個隱含的需求。那么下一步就是將問題進行簡化和轉化,如果我們能將這一堆字符串進行排序,那么最終遍歷這個排過序的字符串集合,發現和前一個相同的字符串就跳過不輸出,對于排序,再簡單不過了,至少N中排序算法,本文不討論各種排序算法,只使用最簡單的冒泡排序來分析。那么怎么保留原有的輸入序呢?這也很簡單,就是在排序元素中增加一個指向原有序的指針即可,另外還有一種方法,那就是排序過程僅僅是一個刪除重復元素的過程,而不影響原有的輸入序列,這個動態行為可以用二叉樹的插入來實現,或者其它的AVL樹以及紅黑樹都可以,本文不會去談這幾棵樹的特性,只是用最簡單的排序二叉樹來分析。

我們知道,在二叉樹插入中,首先要進行一次查找,現在要做的是,如果沒有找到相同的,則插入,如果找到了相同的,則不插入,同時為該元素置入刪除標識。代碼如下:

// // main.c // dup-del // // Created by ya zhao on 11-12-17. // Copyright 2011年 __MyCompanyName__. All rights reserved. // #include #include struct sorted_order_str_map_with_thread { char *sorted_order_str; //保存排序后的字符串 char *normal_order_str; //保存原始字符串 int tag; //指示是否要刪除 struct sorted_order_str_map_with_thread *self; //指向原始的位置 }; void sort(struct sorted_order_str_map_with_thread smwt[], const int size, int (*cmp)(void *, void *), void (*swap)(void *q1, void *q2)); int cmp_node(void *, void *); //比較函數,如果相同則將其tag位設置為0,標示要刪除 int cmp_node(void *q1, void *q2) { int res; struct sorted_order_str_map_with_thread *cmp1, *cmp2; cmp1 = (struct sorted_order_str_map_with_thread*)q1; cmp2 = (struct sorted_order_str_map_with_thread*)q2; res = strcmp(cmp1->sorted_order_str, cmp2->sorted_order_str); if (res == 0) { struct sorted_order_str_map_with_thread *p = cmp2->self; p->tag = 0; } return res; } //交換函數,不光要交換元素,還要交換其self指針 void swap_node(void *q1, void *q2) { struct sorted_order_str_map_with_thread *swp1, *swp2,*temp; char *strTemp; swp1 = (struct sorted_order_str_map_with_thread*)q1; swp2 = (struct sorted_order_str_map_with_thread*)q2; strTemp = swp1->sorted_order_str; temp = (swp1->self); swp1->sorted_order_str = swp2->sorted_order_str; swp1->self = swp2->self; swp2->sorted_order_str = strTemp; swp2->self = temp; } //標準冒泡排序 void sort(struct sorted_order_str_map_with_thread smwt[], const int size, int (*cmp)(void *q1, void *q2), void (*swap)(void *q1, void *q2)) { int flag = 1; for (int i = 0; i < size - 1; i ++) { flag = 1; for (int j = 0; j < size - i - 1; j ++) { int res = 0; if ((res = cmp(&smwt[j], &smwt[j+1])) > 0) { swap(&smwt[j], &smwt[j+1]); flag = 0; } } if (flag == 1) break; } } int main (int argc, const char * argv[]) { int i = 0; //為了簡化,下面使用了最惡心的初始化方法。方便復制粘貼 struct sorted_order_str_map_with_thread smwt[20] = {{NULL, NULL, 0 NULL}}; smwt[0].sorted_order_str =smwt[0].normal_order_str = "323"; smwt[0].self = &smwt[0]; smwt[0].tag = 1; smwt[1].sorted_order_str = smwt[1].normal_order_str="223"; smwt[1].self = &smwt[1]; smwt[1].tag = 2; smwt[2].sorted_order_str =smwt[2].normal_order_str= "723"; smwt[2].self = &smwt[2]; smwt[2].tag = 3; smwt[3].sorted_order_str =smwt[3].normal_order_str= "823"; smwt[3].self = &smwt[3]; smwt[3].tag = 4; smwt[4].sorted_order_str =smwt[4].normal_order_str= "123"; smwt[4].self = &smwt[4]; smwt[4].tag = 5; smwt[5].sorted_order_str =smwt[5].normal_order_str= "423"; smwt[5].self = &smwt[5]; smwt[5].tag = 6; smwt[6].sorted_order_str =smwt[6].normal_order_str= "123"; smwt[6].self = &smwt[6]; smwt[6].tag = 7; smwt[7].sorted_order_str =smwt[7].normal_order_str= "723"; smwt[7].self = &smwt[7]; smwt[7].tag = 8; smwt[8].sorted_order_str = smwt[8].normal_order_str="523"; smwt[8].self = &smwt[8]; smwt[8].tag = 9; smwt[9].sorted_order_str =smwt[9].normal_order_str= "823"; smwt[9].self = &smwt[9]; smwt[9].tag = 10; sort(smwt, 10, cmp_node, swap_node); //下面使用了最惡心的輸出,經典### for (i = 0; i< 10; i++) { printf("###:%s tag:%d\n", smwt[i].normal_order_str, smwt[i].tag); } for (i = 0; i< 10; i++) { printf("@@@:%s tag:%d\n", smwt[i].sorted_order_str, smwt[i].tag); } for (i = 0; i< 10; i++) { if (smwt[i].tag != 0){ printf("@@@&&:%s\n", smwt[i].normal_order_str); } } return 0; }

下面的一種方法使用了標準的二叉樹插入,注意,插入僅僅是為了刪除重復元素,實際上,各種語言各種庫的標準Map實現很多也是使用了樹,比如java.util中的TreeMap就是使用了紅黑樹。下面直接給出代碼,基于排序二叉樹的代碼:

// // main.c // test-xcode // // Created by ya zhao on 11-12-17. // Copyright 2011年 __MyCompanyName__. All rights reserved. // #include #include #include struct string_node { char *string; int tag; //標示是否被刪除 }; //標準排序二叉樹 struct string_tree { struct string_node *strn; struct string_tree* left,*right; }; struct string_tree *add_node(struct string_tree *, struct string_node *str, int (*cmp)(struct string_node *, struct string_node *)); int normalcmp(struct string_node *, struct string_node *); //簡單的字符串比較 int normalcmp(struct string_node *n1, struct string_node *n2) { return strcmp (n1->string,n2->string); } int main(int argc, char **argv) { int j = 0; for (j = 0; j < 1; j++) { struct string_tree *root; struct string_node str[9] = {{"123",1},{"456",1},{"234",1},{"123",1},{"347",1},{"129",1},{"888",1}, {"568",1}, {"456",1}}; root = NULL; int i = 0; while (i<9) { root = add_node(root, &str[i], normalcmp); i ++; } i=0; while (i<9){ if (str[i].tag) { printf("&&&:%s\n", str[i].string); } i++; } } return 0; } struct string_tree *add_node(struct string_tree *p, struct string_node *new, int (*cmp)(struct string_node *n1, struct string_node *n2)) { int cmp_ret; if (p == NULL) { p = (struct string_tree *)calloc(1, sizeof(struct string_tree)); p->strn = (struct string_node*)calloc(1, sizeof(struct string_node)); memcpy(p->strn, new, sizeof(struct string_node)); p->left = p->right = NULL; } else if ((cmp_ret = cmp(new, p->strn)) == 0) { new->tag =0; } else if (cmp_ret < 0) { p->left = add_node(p->left, new, cmp); } else { p->right = add_node(p->right, new, cmp); } return p; }

經過測試,自己實現的上述算法效率還可以,當然這里不該去比較效率,留下個思路即可,在沒有庫可用的情況下,也可以自己實現它。在現實中,特別是在軟件工程中,還是使用現成的map比較好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260049.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260049.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260049.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Zynq7000系列之芯片引腳功能綜述

很多人做了很久的FPGA&#xff0c;知道怎么去給信號分配引腳&#xff0c;卻對這些引腳的功能及其資源限制知之甚少&#xff1b;在第一章里對Zynq7000系列的系統框架進行了分析和論述&#xff0c;對Zynq7000系列的基本資源和概念有了大致的認識&#xff0c;然而要很好地進行硬件…

python模擬購物車購物過程_python實現購物車+ATM機 第五天

模擬實現一個ATM 購物商城程序1.額度 15000或自定義2.實現購物商城&#xff0c;買東西加入 購物車&#xff0c;調用信用卡接口結賬3.可以提現&#xff0c;手續費5%4.每月22號出賬單&#xff0c;每月10號為還款日&#xff0c;過期未還&#xff0c;按欠款總額 萬分之5 每日計息5…

C#使用Cookie方法

代碼Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> //寫入protected void Button1_Click(object sender, EventArgs e){HttpCookie cookienew HttpCookie("MyCook");//初使化并設置Cookie的名稱DateTime…

智能手機計步算法c語言實現,【轉載】智能手機計步器算法的實現

現在的智能手機嵌入了一些微小的傳感器&#xff0c;比如重力傳感器、光傳感器、聲音傳感器等。如何有效地利用這些傳感器來開發一些應用&#xff0c;是一個值得深入研究的課題。比如開發醫療健康的應用、運動量監視器等。本文采用htc Touch Pro智能手機的重力傳感器來開發一款監…

vue點擊按鈕怎么跳轉圖片_vue-router組件里面點擊一個按鈕跳轉到一個新的組件該怎么實現...

展開全部直接修改地址欄中的路由地址即可&#xff1a;{{msg}}var testLogin Vue.component("login",{template:這是我的登錄頁面})var testRegister Vue.component("register",{template:這是我的注冊頁面})//配置路由詞典//對象數組const myRoutes [//…

Arduino教程資料匯總(8月22日悄悄跟新了一下)

http://www.geek-workshop.com/thread-985-1-1.html 本帖最后由 迷你強 于 2013-8-31 12:36 編輯 F-101 arduino基礎套件使用資料 Arduino入門教程--課前準備--Arduino驅動安裝及1.0 IDE菜單介紹Arduino入門教程--第一課--板載Led閃爍實驗Arduino入門教程--第二課--第一次面包板…

HTML5/CSS3系列教程:HTML5 區域(Sectioning)的重要性

日期&#xff1a;2013-2-4 來源&#xff1a;GBin1.com 不管你以前在web頁面布局中如何稱呼它們 - “區域”還是“塊”&#xff0c;我們一直都在布局中將頁面分成可視的不同區域。但真正的問題在于我們并沒有使用任何正確的工具來實現。一般情況下我們使用典型的網格來劃分頁頭…

CoreAnimation —— CAReplicatorLayer(拷貝圖層)

2019獨角獸企業重金招聘Python工程師標準>>> CAReplicatorLayer是一個layer容器&#xff0c;會對其中的subLayer進行一些差異處理&#xff08;它的子layer都可以拷貝&#xff09; 屬性&#xff1a; //拷貝的次數 property NSInteger instanceCount; //是否開啟景深效…

c語言用數組寫密碼程序,想程序高手求助--用C語言來編輯一個輸入密碼的程序...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓/*--------實現密碼的隱式輸入-----------------*/inputpw(char *password,int len) /*len為密碼長度*/{int i0; /*密碼數組索引值,同時也表示記錄已顯示*的數目*/char ch;fflush(stdin); /*清洗流&#xff0c;以防妨礙密碼正確輸入…

ps流 轉發_RTP協議全解析(H264碼流和PS流)(轉)

&lbrack;LeetCode&rsqb; Arranging Coins 排列硬幣You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...使用Jenkins可持續集成maven項目首先下載最新的Jenkins的war包,放在tomcat的webapps的目錄下,然后運行,例…

android 接收短信代碼,短信接收功能實現的代碼

其中包含了widget必備的要素以及對應文件分別為&#xff1a;appwidgetprovider--------------------------SmsWidget.javawidget的config--------------------------SmsWidgetConfig.javawidget引發的app-------------------------SmsAider.javaappwidgetproviderinfo---------…

使用MeanJS Yeoman Generator

1、首先全局安裝該生成器 sudo npm install -g generator-meanjs 2、為項目創建一個路徑 mkdir xmen && cd xmen 3、創建app yo meanjs 根據提示&#xff0c;輸入應用名&#xff0c;描述&#xff0c;關鍵詞&#xff0c;是否創建crud例子。。 4、運行app sudo NODE_ENVd…

Entity Framework With Oracle

雖然EF6都快要出來了&#xff0c;但是對于Oracle數據庫&#xff0c;仍然只能用DB first和Model First來編程&#xff0c;不能用Code First真是一個很大的遺憾啊。 好了&#xff0c;廢話少說&#xff0c;我們來看看EF中是如何用DB first和Model First來對Oracle編程的。 首先我們…

(三)Maven倉庫介紹與本地倉庫配置

1.Maven本地倉庫/遠程倉庫的基本介紹 示意圖&#xff1a; 本地倉庫是指存在于我們本機的倉庫&#xff0c;在我們加入依賴時候&#xff0c;首先會跑到我們的本地倉庫去找&#xff0c;如果找不到則會跑到遠程倉庫中去找。對于依賴的包大家可以從這個地址進行搜索&#xff1a;http…

大數據時代下的遷移學習_繼深度學習后,下一個熱點技術是遷移學習

最早提出大數據時代到來的是知名咨詢公司麥肯錫&#xff0c;麥肯錫稱&#xff1a;“數據&#xff0c;已經滲透到當今每一個行業和業務職能領域&#xff0c;成為重要的生產因素。人們對于海量數據的挖掘和運用&#xff0c;預示著新一波生產率增長和消費者盈余浪潮的到來。”其實…

手機廣告投放(phone advertising)唯一標識

手機標示&#xff0c;為了識別用戶&#xff0c;方面advertising。 使用設備id&#xff0c;相當于暴露用戶隱私。慢慢已不允許使用。、 &#xff08;長時間跟蹤用戶無異于暴露用戶隱私&#xff0c;雖然大量數據適合興趣建模&#xff0c;廣告個性化推薦。但復雜多樣會降低總體的準…

android分辨率比例成像,像素不是唯一 決定成像效果你必知的真相

像素并不是唯一如今不少人在選購一部手機時&#xff0c;非常重視手機攝像頭的像素大小&#xff0c;因為一部高像素的手機可以為不少喜愛拍照的人省去買單反的費用&#xff0c;而且攜帶起來也非常方便。不過&#xff0c;手機并不能與專業的單反相機相比&#xff0c;成像效果并不…

vim——打開多個文件、同時顯示多個文件、在文件之間切換

打開多個文件&#xff1a; 1.vim還沒有啟動的時候&#xff1a; 在終端里輸入 vim file1 file2 ... filen便可以打開所有想要打開的文件 2.vim已經啟動 輸入 :open file 可以再打開一個文件&#xff0c;并且此時vim里會顯示出file文件的內容。 同時顯示多個文件&#xff1a; :s…

Android底部導航欄實現(一)之BottomNavigationBar

BottomNavigationBar這個控件的使用之前已經寫過&#xff0c;這里不再贅述&#xff0c;詳情請參考BottomNavigationBar的使用。 下面直接上代碼&#xff1a; 初始化及相關設置&#xff1a; mBottomNavigationBar (BottomNavigationBar) view.findViewById(R.id.bottom_navigat…

jq 組裝數組_Jquery 數組操作

1、數組的創建var arrayObj new Array(); //創建一個數組var arrayObj new Array([size]); //創建一個數組并指定長度&#xff0c;注意不是上限&#xff0c;是長度var arrayObj new Array([element0[, element1[, ...[, elementN]]]]); 創建一個數組并賦值要說明的是&…