<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
陣列長度是固定的,那麼在很多時候我們並不知道到底有多少資料需要儲存,這時候我麼就需要一個可變長度的陣列來進行儲存,在C語言中需要我們自己進行定義,我們稱為集合
typedef struct charlist { char **str; int len; int capacity; }CharList; typedef int boolean;//定義一個布林型別 #define TRUE 1 #define FALSE 0
//建立一個空節點, 可以指定容量預設為10 CharList *createCharList(int size) { if (size < 10) { size = 10; } //初始化結構體和一個2級指標 CharList *charList = (CharList *) calloc(1, sizeof(CharList)); charList->str= (char **) calloc(size, sizeof(char *)); charList->len = 0; charList->capacity = size; return charList; }
//擴容 static void dilatation(CharList **pCharList) { CharList *charList = *pCharList; int capacity1 =charList->capacity;//獲取當前節點的容積 int size = capacity1 + (capacity1 * 0.75);//容積增加 charList->capacity= size;//更新容積 char **p1 = (char **) realloc(charList->str,size*sizeof(char *)); charList->str=p1; }
static char *createData(char *data){ //插入資料 char *pData = (char *) calloc(strlen(data) + 1,sizeof(char) ); //為啥要+1因為字串結尾需要有一個空字元 strcpy(pData,data); return pData; }
//新增一個值 ,容量不夠會自動在原有基礎上進行擴容*0.75 void addCharList(CharList **pCharList, char *value) { CharList *charList = *pCharList; int len1 = charList->len;//獲取當前節點的長度 int capacity1 =charList->capacity;//獲取陣列的容量 if (len1 == capacity1) { dilatation(pCharList);//擴容 } charList->str[len1] = createData(value);//插入資料 charList->len++; }
void deleteCharList(CharList **pCharList, char *value) { CharList *charList = *pCharList; int len1 = charList->len;//獲取當前節點的長度 for (int i = 0; i < len1; ++i) { if (strcmp(charList->str[i],value)==0) {//找到了 free(charList->str[i]);//釋放記憶體 for (int j = i; j < len1 - 1; ++j) {//後面的節點向前移動 charList->str[j] = charList->str[j + 1]; } charList->len--; break; } } }
//刪除集合內指定下標的值 void deleteCharListByIndex(CharList **pCharList, int index) { CharList *charList = *pCharList; int len1 = charList->len;//獲取當前節點的長度 if (index < 0 || index >= len1) { return; } free(charList->str[index]);//釋放記憶體 for (int j = index; j < len1 - 1; ++j) {//後面的節點向前移動 charList->str[j] = charList->str[j + 1]; } charList->len--; }
//列印所有節點 void printCharList(CharList *pCharList) { int len1 = pCharList->len; for (int i = 0; i < len1; i++) { printf("%sn", pCharList->str[i]); } }
先這樣簡單的使用,如果有需要可以自己定義一套迭代機制
void charListIterator(CharList *pCharList,void (*func)(char *)) { int len1 = pCharList->len; for (int i = 0; i < len1; i++) { func(pCharList->str[i]); } }
//查詢指定元素的下標 ,沒有找到返回-1 int charListIndexOf(CharList *pCharList, char *value) { int len1 = pCharList->len; for (int i = 0; i < len1; i++) { if (strcmp(pCharList->str[i],value)==0) { return i; } } return -1; }
int charListLastIndexOf(CharList *pCharList, char *value) { int len1 = pCharList->len; for (int i = len1 - 1; i >= 0; i--) { if (strcmp(pCharList->str[i],value)==0) { return i; } } return -1; }
/** * 判斷陣列是否有序 * @param pCharList * @param type TRUE: 按照ASCII碼排序 FALSE: 安裝字元長度排序 * @return */ boolean charListIsSorted(CharList *pCharList,boolean type) { int len1 = pCharList->len; boolean result; //返回結果 if(type){//按照ASCII碼排序方式進行判斷 //從小到大 for (int i = 0; i < len1 - 1; i++) { if (strcmp(pCharList->str[i],pCharList->str[i + 1])>0) { result=FALSE; break; } } //從大到小 for (int i = 0; i < len1 - 1; i++) { if (strcmp(pCharList->str[i],pCharList->str[i + 1])<0) { result=FALSE; break; } } }else{ //從小到大 for (int i = 0; i < len1 - 1; i++) { if (strlen(pCharList->str[i])>strlen(pCharList->str[i + 1])) { result=FALSE; break; } } //從大到小 for (int i = 0; i < len1 - 1; i++) { if (strlen(pCharList->str[i])<strlen(pCharList->str[i + 1])) { result=FALSE; break; } } } return result; }
/** * 二分查詢,沒有找到返回-1 以ASCII碼查詢 * @param pCharList * @param value * @return 找到返回下標,沒有找到返回-1 */ int charListBinarySearch(CharList *pCharList, char *value) { if(!charListIsSorted(pCharList,TRUE)){ //判斷是否是排序的陣列,如果不是那麼我們給排序 //二分查詢需要是有序的陣列,所以需要先排序 以ASCII碼進行排序 charListSort(pCharList,1); } int len1 = pCharList->len; int low = 0; int high = len1 - 1; while (low <= high) { int mid = (low + high) / 2;//中間下標 if (strcmp(pCharList->str[mid],value)==0) {//找到了 return mid; } if (strcmp(pCharList->str[mid],value)>0) {//中間值比查詢值大 high = mid - 1;//向左找 } else {//比中間值比差值值小 low = mid + 1;//向右找 } } return -1; }
//修改指定元素的值 void charListSet(CharList *pCharList, char *value, int index) { int len1 = pCharList->len; if (index < 0 || index >= len1) { return; } free(pCharList->str[index]); pCharList->str[index] = createData(value); }
//快速排序 (根據ASCII碼排序,從小到大) static void quickSort(char **str, int left, int right) { if (left >= right) { return; } char *p = str[left]; int i = left; int j = right; while (i < j) { while (i < j && strcmp(str[j],p)>=0) { j--; } str[i] = str[j]; while (i < j && strcmp(str[i],p)<=0) { i++; } str[j] = str[i]; } str[i] = p; quickSort(str, left, i - 1); quickSort(str, i + 1, right); } //快速排序(根據長度排序,從小到大) static void quickSortByLen(char **str, int left, int right) { if (left >= right) { return; } char *p = str[left]; int i = left; int j = right; while (i < j) { while (i < j && strlen(str[j])>=strlen(p)) { j--; } str[i] = str[j]; while (i < j && strlen(str[i])<=strlen(p)) { i++; } str[j] = str[i]; } str[i] = p; quickSortByLen(str, left, i - 1); quickSortByLen(str, i + 1, right); } /** * 根據ASCII碼排序,從小到大,或者根據長度排序,從小到大 * @param pCharList * @param type TRUE就是ASCII碼排序, FALSE就是根據長度排序 */ void charListSort(CharList *pCharList, boolean type) { if(type){ quickSort(pCharList->str, 0, pCharList->len-1); }else{ quickSortByLen(pCharList->str, 0, pCharList->len-1); } }
//去重 void charListDistinct(CharList *pCharList) { int len1 = pCharList->len; for (int i = 0; i < len1; i++) { for (int j = i + 1; j < len1; j++) { if (strcmp(pCharList->str[i],pCharList->str[j])==0) { free(pCharList->str[j]);//釋放記憶體 for (int k = j; k < len1 - 1; ++k) {//將後面的內容向前移動 pCharList->str[k] = pCharList->str[k + 1]; } //去除結尾的元素 pCharList->str[len1 - 1]=NULL; len1--; pCharList->len--;//長度減1 j--;//重新比較 } } } }
//集合複製,返回新集合 CharList *charListCopy(CharList *pCharList) { int len1 = pCharList->len; CharList *pNewCharList = createCharList(len1); for (int i = 0; i < len1; i++) { char *p = createData(pCharList->str[i]); addCharList(&pNewCharList, p); } return pNewCharList; }
//集合合併,返回新集合 CharList *charListMerge(CharList *pCharList1, CharList *pCharList2) { int len1 = pCharList1->len; int len2 = pCharList2->len; CharList *pNewCharList = createCharList(len1 + len2); for (int i = 0; i < len1; i++) { char *p = createData(pCharList1->str[i]); addCharList(&pNewCharList, p); } for (int i = 0; i < len2; i++) { char *p = createData(pCharList2->str[i]); addCharList(&pNewCharList, p); } return pNewCharList; }
記A,B是兩個集合 ,A集合中不存在B集合的元素,那麼A集合就是B集合的差集
//集合差集,返回新集合 CharList *charListDifference(CharList *pCharList1, CharList *pCharList2) { int len1 = pCharList1->len; int len2 = pCharList2->len; CharList *pNewCharList = charListCopy(pCharList1); for (int i = 0; i < len2; i++) { int index = charListIndexOf(pNewCharList, pCharList2->str[i]); if (index != -1) { free(pNewCharList->str[index]);//釋放記憶體 for (int j = index; j < len1 - 1; ++j) {//將後面的內容向前移動 pNewCharList->str[j] = pNewCharList->str[j + 1]; } //去除結尾的元素 pNewCharList->str[len1 - 1]=NULL; len1--; pNewCharList->len--;//長度減1 i--;//重新比較 } } return pNewCharList; }
對於兩個給定集合A、B, 如果A集合中不存在B集合元素,那麼B集合就是A集合的補集,當然反過來也可以說A集合是B集合的補集
//集合補集,返回新集合 CharList *charListComplement(CharList *pCharList1, CharList *pCharList2) { CharList *pCharlist1 = charListDifference(pCharList1, pCharList2); CharList *pCharlist2 = charListDifference(pCharList2, pCharList1); CharList *pCharlist = charListMerge(pCharlist1, pCharlist2); return pCharlist; }
對於兩個給定集合A、B,由兩個集合所有元素構成的集合,叫做A和B的並集。(需要去重只保留一個)
//集合並集,返回新集合 CharList *charListUnion(CharList *pCharList1, CharList *pCharList2) { CharList *pCharlist1 = charListDifference(pCharList1, pCharList2); CharList *pCharlist2 = charListMerge(pCharlist1, pCharList2); return pCharlist2; }
對於兩個給定集合A、B,屬於A又屬於B的所有元素構成的集合,叫做A和B的交集。
//集合交集,返回新集合 CharList *charListIntersection(CharList *pCharList1, CharList *pCharList2) { int len2 = pCharList2->len; CharList *pNewCharList = createCharList(len2/2); for (int i = 0; i < len2; ++i){ int of = charListIndexOf(pCharList1, pCharList2->str[i]); if(of!=-1){ addCharList(&pNewCharList, pCharList2->str[i]); } } return pNewCharList; }
// 釋放記憶體 void charListClean(CharList *pCharList) { //清理陣列內元素 for (int i = 0; i < pCharList->len; ++i) { free(pCharList->str[i]); } //清除陣列 free(pCharList); }
到此這篇關於C語言手寫集合List的範例程式碼的文章就介紹到這了,更多相關C語言集合內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45