From fefec8e73c29d936ab5240036a04b40615d38c4d Mon Sep 17 00:00:00 2001 From: yonglin_zhang <1248825327@qq.com> Date: Fri, 9 Jul 2021 15:08:34 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=9C=A8=E6=A0=B9=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E4=B8=8B=E6=B7=BB=E5=8A=A0cmake?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d4d8aee --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.0) + +project(algorithm C) + +add_subdirectory(list) +add_subdirectory(tree) -- Gitee From 9fa44d384ad1d5c282bac1fb0bf158adeb4b1be0 Mon Sep 17 00:00:00 2001 From: yonglin_zhang <1248825327@qq.com> Date: Fri, 9 Jul 2021 15:09:02 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataElement.h" => list/DataElement.h | 0 .../LinkList.c" => list/LinkList.c | 0 .../LinkList.h" => list/LinkList.h | 0 .../LinkStack.c" => list/LinkStack.c | 0 .../LinkStack.h" => list/LinkStack.h | 0 .../SeqQueue.c" => list/SeqQueue.c | 0 .../SeqQueue.h" => list/SeqQueue.h | 0 .../SeqStack.c" => list/SeqStack.c | 0 .../SeqStack.h" => list/SeqStack.h | 0 .../SeqString.c" => list/SeqString.c | 0 .../SeqString.h" => list/SeqString.h | 0 .../SequenceList.c" => list/SequenceList.c | 0 .../SequenceList.h" => list/SequenceList.h | 0 "\347\272\277\346\200\247\350\241\250/main.c" => list/main.c | 0 .../BinaryLinkedList.c" => tree/BinaryLinkedList.c | 0 .../BinaryLinkedList.h" => tree/BinaryLinkedList.h | 0 .../DataElement.h" => tree/DataElement.h | 0 .../LinkedStack.c" => tree/LinkedStack.c | 0 .../LinkedStack.h" => tree/LinkedStack.h | 0 .../main.c" => tree/main.c | 0 ...51\227\256\351\242\230\347\232\204\346\200\235\350\200\203.md" | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename "\347\272\277\346\200\247\350\241\250/DataElement.h" => list/DataElement.h (100%) rename "\347\272\277\346\200\247\350\241\250/LinkList.c" => list/LinkList.c (100%) rename "\347\272\277\346\200\247\350\241\250/LinkList.h" => list/LinkList.h (100%) rename "\347\272\277\346\200\247\350\241\250/LinkStack.c" => list/LinkStack.c (100%) rename "\347\272\277\346\200\247\350\241\250/LinkStack.h" => list/LinkStack.h (100%) rename "\347\272\277\346\200\247\350\241\250/SeqQueue.c" => list/SeqQueue.c (100%) rename "\347\272\277\346\200\247\350\241\250/SeqQueue.h" => list/SeqQueue.h (100%) rename "\347\272\277\346\200\247\350\241\250/SeqStack.c" => list/SeqStack.c (100%) rename "\347\272\277\346\200\247\350\241\250/SeqStack.h" => list/SeqStack.h (100%) rename "\347\272\277\346\200\247\350\241\250/SeqString.c" => list/SeqString.c (100%) rename "\347\272\277\346\200\247\350\241\250/SeqString.h" => list/SeqString.h (100%) rename "\347\272\277\346\200\247\350\241\250/SequenceList.c" => list/SequenceList.c (100%) rename "\347\272\277\346\200\247\350\241\250/SequenceList.h" => list/SequenceList.h (100%) rename "\347\272\277\346\200\247\350\241\250/main.c" => list/main.c (100%) rename "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/BinaryLinkedList.c" => tree/BinaryLinkedList.c (100%) rename "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/BinaryLinkedList.h" => tree/BinaryLinkedList.h (100%) rename "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/DataElement.h" => tree/DataElement.h (100%) rename "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/LinkedStack.c" => tree/LinkedStack.c (100%) rename "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/LinkedStack.h" => tree/LinkedStack.h (100%) rename "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/main.c" => tree/main.c (100%) rename "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/\345\205\263\344\272\216\346\214\207\351\222\210\347\275\256\347\251\272\345\222\214\351\207\216\346\214\207\351\222\210\351\227\256\351\242\230\347\232\204\346\200\235\350\200\203.md" => "tree/\345\205\263\344\272\216\346\214\207\351\222\210\347\275\256\347\251\272\345\222\214\351\207\216\346\214\207\351\222\210\351\227\256\351\242\230\347\232\204\346\200\235\350\200\203.md" (100%) diff --git "a/\347\272\277\346\200\247\350\241\250/DataElement.h" b/list/DataElement.h similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/DataElement.h" rename to list/DataElement.h diff --git "a/\347\272\277\346\200\247\350\241\250/LinkList.c" b/list/LinkList.c similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/LinkList.c" rename to list/LinkList.c diff --git "a/\347\272\277\346\200\247\350\241\250/LinkList.h" b/list/LinkList.h similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/LinkList.h" rename to list/LinkList.h diff --git "a/\347\272\277\346\200\247\350\241\250/LinkStack.c" b/list/LinkStack.c similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/LinkStack.c" rename to list/LinkStack.c diff --git "a/\347\272\277\346\200\247\350\241\250/LinkStack.h" b/list/LinkStack.h similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/LinkStack.h" rename to list/LinkStack.h diff --git "a/\347\272\277\346\200\247\350\241\250/SeqQueue.c" b/list/SeqQueue.c similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SeqQueue.c" rename to list/SeqQueue.c diff --git "a/\347\272\277\346\200\247\350\241\250/SeqQueue.h" b/list/SeqQueue.h similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SeqQueue.h" rename to list/SeqQueue.h diff --git "a/\347\272\277\346\200\247\350\241\250/SeqStack.c" b/list/SeqStack.c similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SeqStack.c" rename to list/SeqStack.c diff --git "a/\347\272\277\346\200\247\350\241\250/SeqStack.h" b/list/SeqStack.h similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SeqStack.h" rename to list/SeqStack.h diff --git "a/\347\272\277\346\200\247\350\241\250/SeqString.c" b/list/SeqString.c similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SeqString.c" rename to list/SeqString.c diff --git "a/\347\272\277\346\200\247\350\241\250/SeqString.h" b/list/SeqString.h similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SeqString.h" rename to list/SeqString.h diff --git "a/\347\272\277\346\200\247\350\241\250/SequenceList.c" b/list/SequenceList.c similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SequenceList.c" rename to list/SequenceList.c diff --git "a/\347\272\277\346\200\247\350\241\250/SequenceList.h" b/list/SequenceList.h similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/SequenceList.h" rename to list/SequenceList.h diff --git "a/\347\272\277\346\200\247\350\241\250/main.c" b/list/main.c similarity index 100% rename from "\347\272\277\346\200\247\350\241\250/main.c" rename to list/main.c diff --git "a/\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/BinaryLinkedList.c" b/tree/BinaryLinkedList.c similarity index 100% rename from "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/BinaryLinkedList.c" rename to tree/BinaryLinkedList.c diff --git "a/\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/BinaryLinkedList.h" b/tree/BinaryLinkedList.h similarity index 100% rename from "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/BinaryLinkedList.h" rename to tree/BinaryLinkedList.h diff --git "a/\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/DataElement.h" b/tree/DataElement.h similarity index 100% rename from "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/DataElement.h" rename to tree/DataElement.h diff --git "a/\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/LinkedStack.c" b/tree/LinkedStack.c similarity index 100% rename from "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/LinkedStack.c" rename to tree/LinkedStack.c diff --git "a/\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/LinkedStack.h" b/tree/LinkedStack.h similarity index 100% rename from "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/LinkedStack.h" rename to tree/LinkedStack.h diff --git "a/\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/main.c" b/tree/main.c similarity index 100% rename from "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/main.c" rename to tree/main.c diff --git "a/\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/\345\205\263\344\272\216\346\214\207\351\222\210\347\275\256\347\251\272\345\222\214\351\207\216\346\214\207\351\222\210\351\227\256\351\242\230\347\232\204\346\200\235\350\200\203.md" "b/tree/\345\205\263\344\272\216\346\214\207\351\222\210\347\275\256\347\251\272\345\222\214\351\207\216\346\214\207\351\222\210\351\227\256\351\242\230\347\232\204\346\200\235\350\200\203.md" similarity index 100% rename from "\346\240\221\344\270\216\344\272\214\345\217\211\346\240\221/\345\205\263\344\272\216\346\214\207\351\222\210\347\275\256\347\251\272\345\222\214\351\207\216\346\214\207\351\222\210\351\227\256\351\242\230\347\232\204\346\200\235\350\200\203.md" rename to "tree/\345\205\263\344\272\216\346\214\207\351\222\210\347\275\256\347\251\272\345\222\214\351\207\216\346\214\207\351\222\210\351\227\256\351\242\230\347\232\204\346\200\235\350\200\203.md" -- Gitee From 439f851a1a409dd3540b4d4c0e81212a59ed4c63 Mon Sep 17 00:00:00 2001 From: yonglin_zhang <1248825327@qq.com> Date: Fri, 9 Jul 2021 17:19:14 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=BAUTF-8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- list/DataElement.h | 8 +-- list/LinkList.c | 38 +++++----- list/LinkList.h | 22 +++--- list/LinkStack.c | 12 ++-- list/LinkStack.h | 14 ++-- list/SeqQueue.c | 22 +++--- list/SeqQueue.h | 24 +++---- list/SeqStack.c | 10 +-- list/SeqStack.h | 12 ++-- list/SeqString.c | 18 ++--- list/SeqString.h | 22 +++--- list/SequenceList.c | 38 +++++----- list/SequenceList.h | 36 +++++----- list/main.c | 54 +++++++------- tree/BinaryLinkedList.c | 152 ++++++++++++++++++++-------------------- tree/BinaryLinkedList.h | 40 +++++------ tree/DataElement.h | 2 +- tree/LinkedStack.c | 4 +- tree/LinkedStack.h | 16 ++--- 19 files changed, 272 insertions(+), 272 deletions(-) diff --git a/list/DataElement.h b/list/DataElement.h index 3d354a5..67609f2 100644 --- a/list/DataElement.h +++ b/list/DataElement.h @@ -3,15 +3,15 @@ #define DATAELEMENT_H_INCLUDED #define MAX_SIZE 255 -//1.定义数据元素 +//1.瀹氫箟鏁版嵁鍏冪礌 typedef struct{ int id; char * name; }ElementType; -//2.定义顺序表结构 +//2.瀹氫箟椤哄簭琛ㄧ粨鏋 typedef struct{ - ElementType datas[MAX_SIZE]; //顺序表中数据元素的集合 - int length; //当前顺序表中的元素个数 + ElementType datas[MAX_SIZE]; //椤哄簭琛ㄤ腑鏁版嵁鍏冪礌鐨勯泦鍚 + int length; //褰撳墠椤哄簭琛ㄤ腑鐨勫厓绱犱釜鏁 }SeqList; diff --git a/list/LinkList.c b/list/LinkList.c index 53b5447..49aff56 100644 --- a/list/LinkList.c +++ b/list/LinkList.c @@ -12,25 +12,25 @@ void InitLinkList(LinkList * linkList,ElementType * dataArray, int length) void InsertLinkList(LinkList * linkList, int pos, ElementType element) { - //1.创建空结点并给数据域赋值 + //1.鍒涘缓绌虹粨鐐瑰苟缁欐暟鎹煙璧嬪 Node * node = (Node*)malloc(sizeof(Node)); node->data = element; - node->next = NULL; //初始化置空 - //2.找到要插入位置的结点 - if(pos == 1) //如果插入的是第一个元素(问题在于 左边的接上了,右边没有接上 node的next域还是NULL) + node->next = NULL; //鍒濆鍖栫疆绌 + //2.鎵惧埌瑕佹彃鍏ヤ綅缃殑缁撶偣 + if(pos == 1) //濡傛灉鎻掑叆鐨勬槸绗竴涓厓绱狅紙闂鍦ㄤ簬 宸﹁竟鐨勬帴涓婁簡锛屽彸杈规病鏈夋帴涓 node鐨刵ext鍩熻繕鏄疦ULL锛 { - node->next = linkList->next; //接上右边 - linkList->next = node; //接上左边 //头指针指向了新创建的结点 + node->next = linkList->next; //鎺ヤ笂鍙宠竟 + linkList->next = node; //鎺ヤ笂宸﹁竟 //澶存寚閽堟寚鍚戜簡鏂板垱寤虹殑缁撶偣 linkList->length++; return; } - //通过循环找到要插入结点的位置 - Node * currNode = linkList->next;//又创建了一个结点,这个结点指向头指针指向的地方(第一个结点) + //閫氳繃寰幆鎵惧埌瑕佹彃鍏ョ粨鐐圭殑浣嶇疆 + Node * currNode = linkList->next;//鍙堝垱寤轰簡涓涓粨鐐癸紝杩欎釜缁撶偣鎸囧悜澶存寚閽堟寚鍚戠殑鍦版柟锛堢涓涓粨鐐癸級 for(int i = 1; currNode && i < pos - 1; i++) { currNode = currNode->next; } - //将结点插入并对接前面的结点 + //灏嗙粨鐐规彃鍏ュ苟瀵规帴鍓嶉潰鐨勭粨鐐 if(currNode) { node->next = currNode->next; @@ -40,30 +40,30 @@ void InsertLinkList(LinkList * linkList, int pos, ElementType element) } ElementType DeleteLinkList(LinkList * linkList, int pos) { - ElementType element; //要删除的元素。这个变量就是保存要删除的元素 - element.id = -999; //附一个不可能的值,验证是否删除成功 + ElementType element; //瑕佸垹闄ょ殑鍏冪礌銆傝繖涓彉閲忓氨鏄繚瀛樿鍒犻櫎鐨勫厓绱 + element.id = -999; //闄勪竴涓笉鍙兘鐨勫硷紝楠岃瘉鏄惁鍒犻櫎鎴愬姛 Node * node = NULL; - if(pos == 1) //如果要删除的结点是第一个结点 + if(pos == 1) //濡傛灉瑕佸垹闄ょ殑缁撶偣鏄涓涓粨鐐 { node = linkList->next; if(node) { element = node->data; linkList->next = node->next; - free(node); //释放被删除结点的内存 + free(node); //閲婃斁琚垹闄ょ粨鐐圭殑鍐呭瓨 linkList->length--; } return element; } - //1.找到要删除结点和他的前缀结点 - //2.要删除结点的next赋值给前缀结点的next - //3.释放要删除的节点内存 - Node * preNode; //前缀结点 + //1.鎵惧埌瑕佸垹闄ょ粨鐐瑰拰浠栫殑鍓嶇紑缁撶偣 + //2.瑕佸垹闄ょ粨鐐圭殑next璧嬪肩粰鍓嶇紑缁撶偣鐨刵ext + //3.閲婃斁瑕佸垹闄ょ殑鑺傜偣鍐呭瓨 + Node * preNode; //鍓嶇紑缁撶偣 node = linkList->next; for(int i = 1; i < pos && node; i++) { - preNode = node; //保存node之前的那个结点(前缀结点) + preNode = node; //淇濆瓨node涔嬪墠鐨勯偅涓粨鐐癸紙鍓嶇紑缁撶偣锛 node = node->next; } if(node) @@ -88,7 +88,7 @@ void PrintLinkList(LinkList * linkList) Node * node = linkList->next; if(!node) { - printf("链表为空\n"); + printf("閾捐〃涓虹┖\n"); linkList->length = 0; return; } diff --git a/list/LinkList.h b/list/LinkList.h index ab82592..62f916d 100644 --- a/list/LinkList.h +++ b/list/LinkList.h @@ -1,31 +1,31 @@ -//链表Demo +//閾捐〃Demo #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED #include #include #include "DataElement.h" -/* 定义链表的结点 包含数据域和指针域*/ +/* 瀹氫箟閾捐〃鐨勭粨鐐 鍖呭惈鏁版嵁鍩熷拰鎸囬拡鍩*/ typedef struct Node { - ElementType data; //数据域 - struct Node * next; //指针域(没有错 前面的struct Node是类型 就比如int * next一个道理) + ElementType data; //鏁版嵁鍩 + struct Node * next; //鎸囬拡鍩(娌℃湁閿 鍓嶉潰鐨剆truct Node鏄被鍨 灏辨瘮濡俰nt * next涓涓亾鐞) }Node; -//头结点 +//澶寸粨鐐 typedef struct LinkList { - Node * next; //头指针 如果链表有头结点,next就指向头结点。如果没有就指向第一个结点 - int length; //链表的长度,初始值为0; + Node * next; //澶存寚閽 濡傛灉閾捐〃鏈夊ご缁撶偣锛宯ext灏辨寚鍚戝ご缁撶偣銆傚鏋滄病鏈夊氨鎸囧悜绗竴涓粨鐐 + int length; //閾捐〃鐨勯暱搴︼紝鍒濆鍊间负0锛 }LinkList; -//初始化链表 +//鍒濆鍖栭摼琛 void InitLinkList(LinkList * linkList,ElementType * dataArray, int length); -//在制定的位置pos处插入元素element +//鍦ㄥ埗瀹氱殑浣嶇疆pos澶勬彃鍏ュ厓绱爀lement void InsertLinkList(LinkList * linkList, int pos, ElementType element); -//删除链表中的位置为pos的结点; +//鍒犻櫎閾捐〃涓殑浣嶇疆涓簆os鐨勭粨鐐癸紱 ElementType DeleteLinkList(LinkList * linkList, int pos); -//打印链表 +//鎵撳嵃閾捐〃 void PrintLinkList(LinkList * linkList); diff --git a/list/LinkStack.c b/list/LinkStack.c index 952ca47..d1bdf0a 100644 --- a/list/LinkStack.c +++ b/list/LinkStack.c @@ -1,15 +1,15 @@ #include "LinkStack.h" #include -//初始化栈 +//鍒濆鍖栨爤 void InitLinkStack(LinkStack * s){ s->Top = NULL; s->length = 0; } -//压栈 将元素e压入栈中 返回值int为0代表失败,1为成功。 +//鍘嬫爤 灏嗗厓绱爀鍘嬪叆鏍堜腑 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int LSPush(LinkStack * s, ElementType e){ - StackNode * node = (StackNode *)malloc(sizeof(StackNode)); //创建一个结点,节点里存放新压入元素e的信息 + StackNode * node = (StackNode *)malloc(sizeof(StackNode)); //鍒涘缓涓涓粨鐐癸紝鑺傜偣閲屽瓨鏀炬柊鍘嬪叆鍏冪礌e鐨勪俊鎭 node->data = e; node->next = s->Top; s->Top = node; @@ -17,7 +17,7 @@ int LSPush(LinkStack * s, ElementType e){ return 1; } -//删除栈S中的栈顶元素,并用e来返回弹出的值 返回值int为0代表失败,1为成功。 +//鍒犻櫎鏍圫涓殑鏍堥《鍏冪礌锛屽苟鐢╡鏉ヨ繑鍥炲脊鍑虹殑鍊 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int LSPop(LinkStack * s, ElementType * e){ *e = s->Top->data; StackNode * node = s->Top; @@ -27,11 +27,11 @@ int LSPop(LinkStack * s, ElementType * e){ return 1; } -//遍历打印栈内元素 +//閬嶅巻鎵撳嵃鏍堝唴鍏冪礌 void TraversalPrintStack(LinkStack * s){ LinkStack * temp = s; while(temp->length != 0){ - printf("当前栈内元素:%d\t%s\n",temp->Top->data.id, temp->Top->data.name); + printf("褰撳墠鏍堝唴鍏冪礌锛%d\t%s\n",temp->Top->data.id, temp->Top->data.name); temp->Top = temp->Top->next; temp->length--; } diff --git a/list/LinkStack.h b/list/LinkStack.h index 5d36b3a..d81efe2 100644 --- a/list/LinkStack.h +++ b/list/LinkStack.h @@ -1,30 +1,30 @@ #ifndef LINKSTACK_H_INCLUDED #define LINKSTACK_H_INCLUDED -//链栈 +//閾炬爤 #include #include #include "DataElement.h" -//结点 分为数据域和指针域。和链表的结点一模一样 +//缁撶偣 鍒嗕负鏁版嵁鍩熷拰鎸囬拡鍩熴傚拰閾捐〃鐨勭粨鐐逛竴妯′竴鏍 typedef struct StackNode{ ElementType data; struct StackNode * next; }StackNode; -//存放栈顶指针的数据结构。里面有栈顶指针和栈的length +//瀛樻斁鏍堥《鎸囬拡鐨勬暟鎹粨鏋勩傞噷闈㈡湁鏍堥《鎸囬拡鍜屾爤鐨刲ength typedef struct LinkStack{ StackNode * Top; int length; }LinkStack; -//初始化栈 +//鍒濆鍖栨爤 void InitLinkStack(LinkStack * s); -//压栈 将元素e压入栈中 返回值int为0代表失败,1为成功。 +//鍘嬫爤 灏嗗厓绱爀鍘嬪叆鏍堜腑 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int LSPush(LinkStack * s, ElementType e); -//删除栈S中的栈顶元素,并用e来返回弹出的值 返回值int为0代表失败,1为成功。 +//鍒犻櫎鏍圫涓殑鏍堥《鍏冪礌锛屽苟鐢╡鏉ヨ繑鍥炲脊鍑虹殑鍊 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int LSPop(LinkStack * s, ElementType * e); -//遍历打印栈内元素 +//閬嶅巻鎵撳嵃鏍堝唴鍏冪礌 void TraversalPrintStack(LinkStack * s); diff --git a/list/SeqQueue.c b/list/SeqQueue.c index c341c27..a3ba560 100644 --- a/list/SeqQueue.c +++ b/list/SeqQueue.c @@ -1,8 +1,8 @@ #include "SeqQueue.h" #include -// 初始化 +// 鍒濆鍖 void InitSeqQueue(SeqQueqe * seqQueue){ - //如果队列不存在,那么就创建一个队列(开辟一个内存) + //濡傛灉闃熷垪涓嶅瓨鍦紝閭d箞灏卞垱寤轰竴涓槦鍒楋紙寮杈熶竴涓唴瀛橈級 if(seqQueue == NULL){ seqQueue = (SeqQueqe *)malloc(sizeof(SeqQueqe)); } @@ -11,17 +11,17 @@ void InitSeqQueue(SeqQueqe * seqQueue){ seqQueue->rear = 0; } -//判断队列是否为空 -//以TRUE / FALSE的方式返回传入的队列是否为空 +//鍒ゆ柇闃熷垪鏄惁涓虹┖ +//浠RUE / FALSE鐨勬柟寮忚繑鍥炰紶鍏ョ殑闃熷垪鏄惁涓虹┖ State IsSeqQueueEmpty(SeqQueqe * seqQueue){ - //对头指针如果等于队尾指针,那么队列为空 + //瀵瑰ご鎸囬拡濡傛灉绛変簬闃熷熬鎸囬拡锛岄偅涔堥槦鍒椾负绌 if(seqQueue->front == seqQueue->rear){ return STATE_OK; } else return STATE_FAILED; } -//判断队列是否为满 +//鍒ゆ柇闃熷垪鏄惁涓烘弧 State IsSeqQueueFull(SeqQueqe * seqQueue){ if( (seqQueue->rear+1) % MAX_SIZE == seqQueue->front){ return STATE_OK; @@ -30,25 +30,25 @@ State IsSeqQueueFull(SeqQueqe * seqQueue){ return STATE_FAILED; } -//入队 +//鍏ラ槦 State OfferSeqQueue(SeqQueqe * seq, ElementType ele){ if(IsSeqQueueFull(seq)){ return STATE_FAILED; } seq->data[seq->rear] = ele; - //rear指针向后移动一位 + //rear鎸囬拡鍚戝悗绉诲姩涓浣 seq->rear = (seq->rear + 1) % MAX_SIZE; seq->length++; return STATE_OK; } -//出队 传进去指针类型的ele是为了用指针记录(返回)被抛出的元素 +//鍑洪槦 浼犺繘鍘绘寚閽堢被鍨嬬殑ele鏄负浜嗙敤鎸囬拡璁板綍锛堣繑鍥烇級琚姏鍑虹殑鍏冪礌 State PollSeqQueue(SeqQueqe * seq, ElementType * ele){ if(IsSeqQueueEmpty(seq)) return STATE_FAILED; - //取出队头元素 (下一行的ele用不用加星号???) + //鍙栧嚭闃熷ご鍏冪礌 (涓嬩竴琛岀殑ele鐢ㄤ笉鐢ㄥ姞鏄熷彿锛燂紵锛) *ele = seq->data[seq->front]; - //front指针向后移动一位 + //front鎸囬拡鍚戝悗绉诲姩涓浣 seq->front = (seq->front + 1) % MAX_SIZE; seq->length--; return STATE_OK; diff --git a/list/SeqQueue.h b/list/SeqQueue.h index fb12100..2d3a4c6 100644 --- a/list/SeqQueue.h +++ b/list/SeqQueue.h @@ -1,4 +1,4 @@ -//顺序队列Demo +//椤哄簭闃熷垪Demo #ifndef SEQQUEUE_H_INCLUDED #define SEQQUEUE_H_INCLUDED @@ -8,28 +8,28 @@ #define STATE_FAILED 0; -typedef int State; //给整型起一个别名,专门用来表示状态 -/* 循环队列结构 */ +typedef int State; //缁欐暣鍨嬭捣涓涓埆鍚嶏紝涓撻棬鐢ㄦ潵琛ㄧず鐘舵 +/* 寰幆闃熷垪缁撴瀯 */ typedef struct{ ElementType data[MAX_SIZE]; - int front; //队头指针 - int rear; //队尾指针 - int length; //队列长度 + int front; //闃熷ご鎸囬拡 + int rear; //闃熷熬鎸囬拡 + int length; //闃熷垪闀垮害 }SeqQueqe; -//初始化 +//鍒濆鍖 void InitSeqQueue(SeqQueqe * seqQueue); -//判断队列是否为空 -//以TRUE / FALSE的方式返回传入的队列是否为空 +//鍒ゆ柇闃熷垪鏄惁涓虹┖ +//浠RUE / FALSE鐨勬柟寮忚繑鍥炰紶鍏ョ殑闃熷垪鏄惁涓虹┖ State IsSeqQueueEmpty(SeqQueqe * seqQueue); -//判断队列是否为满 +//鍒ゆ柇闃熷垪鏄惁涓烘弧 State IsSeqQueueFull(SeqQueqe * seqQueue); -//入队 +//鍏ラ槦 State OfferSeqQueue(SeqQueqe * seq, ElementType ele); -//出队 传进去指针类型的ele是为了用指针记录(返回)被抛出的元素 +//鍑洪槦 浼犺繘鍘绘寚閽堢被鍨嬬殑ele鏄负浜嗙敤鎸囬拡璁板綍锛堣繑鍥烇級琚姏鍑虹殑鍏冪礌 State PollSeqQueue(SeqQueqe * seq, ElementType * ele); #endif // SEQQUEUE_H_INCLUDED diff --git a/list/SeqStack.c b/list/SeqStack.c index f6ab541..54a8e2f 100644 --- a/list/SeqStack.c +++ b/list/SeqStack.c @@ -1,15 +1,15 @@ #include "SeqStack.h" #include -//初始化栈 +//鍒濆鍖栨爤 void InitStack(SeqStack * s){ s->top = -1; s->length = 0; } -//压栈 将元素e压入栈中 返回值int为0代表失败,1为成功。 +//鍘嬫爤 灏嗗厓绱爀鍘嬪叆鏍堜腑 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int Push(SeqStack * s, ElementType e){ - if(s->top == MAX_SIZE - 1) //如果栈满了,那么插入失败,返回0 + if(s->top == MAX_SIZE - 1) //濡傛灉鏍堟弧浜嗭紝閭d箞鎻掑叆澶辫触锛岃繑鍥0 return 0; s->top++; s->data[s->top] = e; @@ -17,9 +17,9 @@ int Push(SeqStack * s, ElementType e){ return 1; } -//删除栈S中的栈顶元素,并用e来返回弹出的值 返回值int为0代表失败,1为成功。 +//鍒犻櫎鏍圫涓殑鏍堥《鍏冪礌锛屽苟鐢╡鏉ヨ繑鍥炲脊鍑虹殑鍊 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int Pop(SeqStack * s, ElementType * e){ - if(s->top == -1) //如果栈是空的,那么删除失败,返回0 + if(s->top == -1) //濡傛灉鏍堟槸绌虹殑锛岄偅涔堝垹闄ゅけ璐ワ紝杩斿洖0 return 0; *e = s->data[s->top]; s->top--; diff --git a/list/SeqStack.h b/list/SeqStack.h index e4e0dde..ca9ea01 100644 --- a/list/SeqStack.h +++ b/list/SeqStack.h @@ -1,19 +1,19 @@ -//顺序栈Demo +//椤哄簭鏍圖emo #ifndef SEQSTACK_H_INCLUDED #define SEQSTACK_H_INCLUDED #include "DataElement.h" typedef struct{ ElementType data[MAX_SIZE]; - int top; //用于栈顶指针 - int length; //栈长度 + int top; //鐢ㄤ簬鏍堥《鎸囬拡 + int length; //鏍堥暱搴 }SeqStack; -//初始化栈 +//鍒濆鍖栨爤 void InitStack(SeqStack * s); -//压栈 将元素e压入栈中 返回值int为0代表失败,1为成功。 +//鍘嬫爤 灏嗗厓绱爀鍘嬪叆鏍堜腑 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int Push(SeqStack * s, ElementType e); -//删除栈S中的栈顶元素,并用e来返回弹出的值 返回值int为0代表失败,1为成功。 +//鍒犻櫎鏍圫涓殑鏍堥《鍏冪礌锛屽苟鐢╡鏉ヨ繑鍥炲脊鍑虹殑鍊 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int Pop(SeqStack * s, ElementType * e); #endif // SEQSTACK_H_INCLUDED diff --git a/list/SeqString.c b/list/SeqString.c index 9a53a0c..b316e2d 100644 --- a/list/SeqString.c +++ b/list/SeqString.c @@ -2,34 +2,34 @@ #include #include #include -//初始化串 +//鍒濆鍖栦覆 void InitHeapString(HString * str){ str->ch = NULL; str->length = 0; } -//为串str赋值 值为字符串常量chars +//涓轰覆str璧嬪 鍊间负瀛楃涓插父閲廲hars int AssignHeapString(HString * str, char* chars){ int len = strlen(chars); - if(!len) //如果chars是空串,那么返回-1.代表失败 + if(!len) //濡傛灉chars鏄┖涓诧紝閭d箞杩斿洖-1.浠h〃澶辫触 return -1; InitHeapString(str); - str->ch = (char*)malloc(len * sizeof(char)); //为str里面的ch申请内存空间 原因是ch也是char*类型的 + str->ch = (char*)malloc(len * sizeof(char)); //涓簊tr閲岄潰鐨刢h鐢宠鍐呭瓨绌洪棿 鍘熷洜鏄痗h涔熸槸char*绫诲瀷鐨 for(int i = 0; i < len; i++){ str->ch[i] = chars[i]; } str->length = len; - return 1; //插进去了返回1 代表成功 + return 1; //鎻掕繘鍘讳簡杩斿洖1 浠h〃鎴愬姛 } -//打印堆字符串 +//鎵撳嵃鍫嗗瓧绗︿覆 void PrintHeapString(HString * str){ for(int i = 0; i < str->length; i++) printf("%c", str->ch[i]); } -//将串srcstr的内容复制到deststr里面 +//灏嗕覆srcstr鐨勫唴瀹瑰鍒跺埌deststr閲岄潰 int StrCpyHeapString(HString * destStr, HString * srcStr){ InitHeapString(destStr); if(IsHeapStringEmpty(srcStr)){ - printf("要复制的字符串不能为空"); + printf("瑕佸鍒剁殑瀛楃涓蹭笉鑳戒负绌"); return 0; } destStr->ch = (char*)malloc(sizeof(char) * srcStr->length); @@ -40,7 +40,7 @@ int StrCpyHeapString(HString * destStr, HString * srcStr){ return 1; } -//判断字符串是否为空 +//鍒ゆ柇瀛楃涓叉槸鍚︿负绌 int IsHeapStringEmpty(HString * str){ if(str->length == 0 || !str->ch) return 1; diff --git a/list/SeqString.h b/list/SeqString.h index ecef148..af2aa31 100644 --- a/list/SeqString.h +++ b/list/SeqString.h @@ -1,24 +1,24 @@ -//顺序字符串 Demo -//用最基础的代码实现 strlen() strcat() strcpy()这些东西 +//椤哄簭瀛楃涓 Demo +//鐢ㄦ渶鍩虹鐨勪唬鐮佸疄鐜 strlen() strcat() strcpy()杩欎簺涓滆タ #ifndef SEQSTRING_H_INCLUDED #define SEQSTRING_H_INCLUDED -/* 这种方法是用数组存贮结构,是定长的(MAXSIZE)。缺点是浪费空间 -typedef struct{ //顺序串 - char ch[MAX_SIZE]; //存储字符的数组 - int length; //串的当前长度 +/* 杩欑鏂规硶鏄敤鏁扮粍瀛樿串缁撴瀯锛屾槸瀹氶暱鐨勶紙MAXSIZE锛夈傜己鐐规槸娴垂绌洪棿 +typedef struct{ //椤哄簭涓 + char ch[MAX_SIZE]; //瀛樺偍瀛楃鐨勬暟缁 + int length; //涓茬殑褰撳墠闀垮害 }SString; */ -typedef struct{ //堆结构存储 - char * ch; //如果是非空串,那么按照指定长度分配内存,否则ch就指向null +typedef struct{ //鍫嗙粨鏋勫瓨鍌 + char * ch; //濡傛灉鏄潪绌轰覆锛岄偅涔堟寜鐓ф寚瀹氶暱搴﹀垎閰嶅唴瀛橈紝鍚﹀垯ch灏辨寚鍚憂ull int length; }HString; -//初始化串 +//鍒濆鍖栦覆 void InitHeapString(HString * str); -//为串str赋值 值为字符串常量chars +//涓轰覆str璧嬪 鍊间负瀛楃涓插父閲廲hars int AssignHeapString(HString * str, char* chars); -//打印堆字符串 +//鎵撳嵃鍫嗗瓧绗︿覆 void PrintHeapString(HString * str); diff --git a/list/SequenceList.c b/list/SequenceList.c index 29f61b2..4a09d60 100644 --- a/list/SequenceList.c +++ b/list/SequenceList.c @@ -1,14 +1,14 @@ #include "SequenceList.h" /* - * 初始化顺序表 - * @param seqList 要初始化的顺序表 - * @param elemArray 初始化时要添加的内容元素数组 - * @param length 初始化时要添加的元素个数 + * 鍒濆鍖栭『搴忚〃 + * @param seqList 瑕佸垵濮嬪寲鐨勯『搴忚〃 + * @param elemArray 鍒濆鍖栨椂瑕佹坊鍔犵殑鍐呭鍏冪礌鏁扮粍 + * @param length 鍒濆鍖栨椂瑕佹坊鍔犵殑鍏冪礌涓暟 */ void InitList(SeqList * seqList, ElementType * elemArray, int length) { seqList->length = 0; - //记得在初始化顺序表时,把顺序表长度置零 + //璁板緱鍦ㄥ垵濮嬪寲椤哄簭琛ㄦ椂锛屾妸椤哄簭琛ㄩ暱搴︾疆闆 for(int i = 0; i < length; i++) { InsertElement(seqList, i, elemArray[i]); @@ -17,10 +17,10 @@ void InitList(SeqList * seqList, ElementType * elemArray, int length) /* - * 向顺序表中index下标的位置处插入某个元素 - * @param seqList 要初始化的顺序表 - * @param index 要插入的下标 - * @param element 要插入的元素 + * 鍚戦『搴忚〃涓璱ndex涓嬫爣鐨勪綅缃鎻掑叆鏌愪釜鍏冪礌 + * @param seqList 瑕佸垵濮嬪寲鐨勯『搴忚〃 + * @param index 瑕佹彃鍏ョ殑涓嬫爣 + * @param element 瑕佹彃鍏ョ殑鍏冪礌 */ void InsertElement(SeqList * seqList, int index, ElementType element) { @@ -28,32 +28,32 @@ void InitList(SeqList * seqList, ElementType * elemArray, int length) { seqList->datas[i + 1] = seqList->datas[i]; } - //将要插入的值赋给index个元素 + //灏嗚鎻掑叆鐨勫艰祴缁檌ndex涓厓绱 seqList->datas[index] = element; - //顺序表的总长度加一 非常容易漏掉!!!! + //椤哄簭琛ㄧ殑鎬婚暱搴﹀姞涓 闈炲父瀹规槗婕忔帀锛侊紒锛侊紒 seqList->length++; } ElementType * DeleteElement(SeqList * seqList, int index) { - //1.找到要删除的元素,保存起来以便返回(保存的是值不是地址。是副本) - ElementType * delElement = (ElementType*)malloc(sizeof(ElementType)); //这一套操作可以写一个临时笔记了 临时笔记就在桌面 - //单独定义并调用查找函数,返回要删除元素的指针 + //1.鎵惧埌瑕佸垹闄ょ殑鍏冪礌锛屼繚瀛樿捣鏉ヤ互渚胯繑鍥烇紙淇濆瓨鐨勬槸鍊间笉鏄湴鍧銆傛槸鍓湰锛 + ElementType * delElement = (ElementType*)malloc(sizeof(ElementType)); //杩欎竴濂楁搷浣滃彲浠ュ啓涓涓复鏃剁瑪璁颁簡 涓存椂绗旇灏卞湪妗岄潰 + //鍗曠嫭瀹氫箟骞惰皟鐢ㄦ煡鎵惧嚱鏁帮紝杩斿洖瑕佸垹闄ゅ厓绱犵殑鎸囬拡 *delElement = *GetElement(seqList,index); - //2.从指定位置删除,后面一个元素赋值给前面一个元素 + //2.浠庢寚瀹氫綅缃垹闄わ紝鍚庨潰涓涓厓绱犺祴鍊肩粰鍓嶉潰涓涓厓绱 for(int i = index; i < seqList->length-1; i++) { seqList->datas[i] = seqList->datas[i + 1]; } - //3.顺序表的总长度-1 + //3.椤哄簭琛ㄧ殑鎬婚暱搴-1 seqList->length--; - return delElement; // 这里没有错 就是返回的指针(指针变量指向的那块地址)。容易想当然的认为应该返回*delElement - //使用完毕记得free 否则就会内存泄漏 + return delElement; // 杩欓噷娌℃湁閿 灏辨槸杩斿洖鐨勬寚閽堬紙鎸囬拡鍙橀噺鎸囧悜鐨勯偅鍧楀湴鍧锛夈傚鏄撴兂褰撶劧鐨勮涓哄簲璇ヨ繑鍥*delElement + //浣跨敤瀹屾瘯璁板緱free 鍚﹀垯灏变細鍐呭瓨娉勬紡 } ElementType * GetElement(SeqList * seqList, int index) { - ElementType * element; //这是要查找的元素,保存起来是为了返回 + ElementType * element; //杩欐槸瑕佹煡鎵剧殑鍏冪礌锛屼繚瀛樿捣鏉ユ槸涓轰簡杩斿洖 element = &seqList->datas[index]; return element; } diff --git a/list/SequenceList.h b/list/SequenceList.h index ac5b1c6..c885c74 100644 --- a/list/SequenceList.h +++ b/list/SequenceList.h @@ -1,4 +1,4 @@ -//定义顺序表 +//瀹氫箟椤哄簭琛 #ifndef SEQUENCELIST_H_INCLUDED #define SEQUENCELIST_H_INCLUDED @@ -6,41 +6,41 @@ #include #include "DataElement.h" /* - * 初始化顺序表 - * @param seqList 要初始化的顺序表 - * @param elemArray 初始化时要添加的内容元素数组 - * @param length 初始化时要添加的元素个数 + * 鍒濆鍖栭『搴忚〃 + * @param seqList 瑕佸垵濮嬪寲鐨勯『搴忚〃 + * @param elemArray 鍒濆鍖栨椂瑕佹坊鍔犵殑鍐呭鍏冪礌鏁扮粍 + * @param length 鍒濆鍖栨椂瑕佹坊鍔犵殑鍏冪礌涓暟 */ void InitList(SeqList * seqList, ElementType * elemArray, int length); /* - * 初始化顺序表 - * @param seqList 向顺序表中index下标的位置处插入某个元素 - * @param index 要插入的下标 - * @param element 要插入的元素 + * 鍒濆鍖栭『搴忚〃 + * @param seqList 鍚戦『搴忚〃涓璱ndex涓嬫爣鐨勪綅缃鎻掑叆鏌愪釜鍏冪礌 + * @param index 瑕佹彃鍏ョ殑涓嬫爣 + * @param element 瑕佹彃鍏ョ殑鍏冪礌 */ void InsertElement(SeqList * seqList, int index, ElementType element); /* - * 删除顺序表中指定下标的元素 - * @param seqList 要操作的顺序表 - * @param index 要删除的下标 - * @return 返回删除的元素,如果删除失败,返回null + * 鍒犻櫎椤哄簭琛ㄤ腑鎸囧畾涓嬫爣鐨勫厓绱 + * @param seqList 瑕佹搷浣滅殑椤哄簭琛 + * @param index 瑕佸垹闄ょ殑涓嬫爣 + * @return 杩斿洖鍒犻櫎鐨勫厓绱狅紝濡傛灉鍒犻櫎澶辫触锛岃繑鍥瀗ull */ ElementType * DeleteElement(SeqList * seqList, int index); /* - * 查找顺序表中指定下标的元素 - * @param seqList 要操作的顺序表 - * @param index 要查找元素的下标 - * @return 返回要查找的元素,如果查找失败,返回null + * 鏌ユ壘椤哄簭琛ㄤ腑鎸囧畾涓嬫爣鐨勫厓绱 + * @param seqList 瑕佹搷浣滅殑椤哄簭琛 + * @param index 瑕佹煡鎵惧厓绱犵殑涓嬫爣 + * @return 杩斿洖瑕佹煡鎵剧殑鍏冪礌锛屽鏋滄煡鎵惧け璐ワ紝杩斿洖null */ ElementType * GetElement(SeqList * seqList, int index); - //打印顺序表 @param seqList 要打印的顺序表 + //鎵撳嵃椤哄簭琛 @param seqList 瑕佹墦鍗扮殑椤哄簭琛 void PrintList(SeqList * seqList); diff --git a/list/main.c b/list/main.c index bd8cbe4..9eb09e2 100644 --- a/list/main.c +++ b/list/main.c @@ -10,20 +10,20 @@ //#include "LinkList.c" /* - 坑爹的code block 除了sources和headers这两个文件夹 其他的什么都不要有! - 否则就会出现multiple definition的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + 鍧戠埞鐨刢ode block 闄や簡sources鍜宧eaders杩欎袱涓枃浠跺す 鍏朵粬鐨勪粈涔堥兘涓嶈鏈夛紒 + 鍚﹀垯灏变細鍑虹幇multiple definition鐨勯棶棰橈紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛 + 锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛 + 锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛 + 锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒 + 锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + 锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛 */ ElementType dataArray[] = { {1,"van"}, {2,"billy"}, {3,"banana"}, - {4,"亚索"} + {4,"浜氱储"} }; void TestSequenceList(); @@ -44,8 +44,8 @@ int main() void TestSeqString(){ - //这一步和SeqString.c中第16行并不冲突。原因是这里是为整个HString类型的str申请内存空间,申请的 - //大小也是HString类型这么大。而SeqString.c中第16行是为str中的ch元素 单独申请内存空间 + //杩欎竴姝ュ拰SeqString.c涓16琛屽苟涓嶅啿绐併傚師鍥犳槸杩欓噷鏄负鏁翠釜HString绫诲瀷鐨剆tr鐢宠鍐呭瓨绌洪棿锛岀敵璇风殑 + //澶у皬涔熸槸HString绫诲瀷杩欎箞澶с傝孲eqString.c涓16琛屾槸涓簊tr涓殑ch鍏冪礌 鍗曠嫭鐢宠鍐呭瓨绌洪棿 HString * str1 = (HString *)malloc(sizeof(HString)); HString * str2 = (HString *)malloc(sizeof(HString)); @@ -53,7 +53,7 @@ void TestSeqString(){ PrintHeapString(str1); StrCpyHeapString(str2,str1); - printf("\n复制后的str2:\n"); + printf("\n澶嶅埗鍚庣殑str2锛歕n"); PrintHeapString(str2); @@ -64,34 +64,34 @@ void TestSeqString(){ void TestSequenceList() { SeqList seqList; - ElementType * delElement; //这里定义指针是没错的。因为DeleteElement的返回值也是指针,用指针接收指针 + ElementType * delElement; //杩欓噷瀹氫箟鎸囬拡鏄病閿欑殑銆傚洜涓篋eleteElement鐨勮繑鍥炲间篃鏄寚閽堬紝鐢ㄦ寚閽堟帴鏀舵寚閽 InitList(&seqList, dataArray, sizeof(dataArray) / sizeof(dataArray[0])); PrintList(&seqList); delElement = DeleteElement(&seqList,2); - printf("删除后\n"); + printf("鍒犻櫎鍚嶾n"); PrintList(&seqList); - printf("被删除的元素:\n"); + printf("琚垹闄ょ殑鍏冪礌锛歕n"); printf("%d\t%s\n",delElement->id,delElement->name); - free(delElement);//记得free + free(delElement);//璁板緱free } void TestLinkList() { LinkList linkList; - linkList.length = 0; //非常容易忽略。初始化长度为0 + linkList.length = 0; //闈炲父瀹规槗蹇界暐銆傚垵濮嬪寲闀垮害涓0 InitLinkList(&linkList, dataArray, sizeof(dataArray) / sizeof(dataArray[0])); PrintLinkList(&linkList); ElementType element; element.id = 123; element.name = (char*)malloc(10); - strcpy(element.name, "木吉"); + strcpy(element.name, "鏈ㄥ悏"); InsertLinkList(&linkList, 2 , element); - printf("插入后\n"); + printf("鎻掑叆鍚嶾n"); PrintLinkList(&linkList); - printf("删除第三个元素后\n"); + printf("鍒犻櫎绗笁涓厓绱犲悗\n"); ElementType beenDeleted = DeleteLinkList(&linkList, 3); PrintLinkList(&linkList); - printf("被删除的元素是\n"); + printf("琚垹闄ょ殑鍏冪礌鏄痋n"); printf("%d\t%s\n",beenDeleted.id,beenDeleted.name); } void TestSeqStack(){ @@ -99,15 +99,15 @@ void TestSeqStack(){ InitStack(&s); for(int i = 0; i < 4; i++){ printf("%d",Push(&s, dataArray[i])); - printf("当前入栈:%d\t%s\n",dataArray[i].id, dataArray[i].name); + printf("褰撳墠鍏ユ爤锛%d\t%s\n",dataArray[i].id, dataArray[i].name); } - ElementType * e = (ElementType *)malloc(sizeof(ElementType)); //e用来存放弹出栈的元素。开辟一个空间 + ElementType * e = (ElementType *)malloc(sizeof(ElementType)); //e鐢ㄦ潵瀛樻斁寮瑰嚭鏍堢殑鍏冪礌銆傚紑杈熶竴涓┖闂 Pop(&s, e); - printf("当前出栈元素:%d\t%s\n",e->id,e->name); + printf("褰撳墠鍑烘爤鍏冪礌锛%d\t%s\n",e->id,e->name); Pop(&s, e); - printf("当前出栈元素:%d\t%s\n",e->id,e->name); + printf("褰撳墠鍑烘爤鍏冪礌锛%d\t%s\n",e->id,e->name); for(int i = 0; i < s.length; i++){ - printf("栈里面还剩下:%d\t%s\n",s.data[i].id, s.data[i].name); + printf("鏍堥噷闈㈣繕鍓╀笅锛%d\t%s\n",s.data[i].id, s.data[i].name); } } @@ -125,9 +125,9 @@ void TestSeqQueue(){ } ElementType * ele = (ElementType *)malloc(sizeof(ElementType)); PollSeqQueue(&seq, ele); - printf("当前出队的元素是:\n"); + printf("褰撳墠鍑洪槦鐨勫厓绱犳槸锛歕n"); printf("%d\t%s\n", ele->id, ele->name); - printf("出队操作之后的队列元素是:\n"); + printf("鍑洪槦鎿嶄綔涔嬪悗鐨勯槦鍒楀厓绱犳槸锛歕n"); for(int i = seq.front; i < seq.rear; i++){ printf("%d\t%s\n", seq.data[i].id, seq.data[i].name); } diff --git a/tree/BinaryLinkedList.c b/tree/BinaryLinkedList.c index 3b87997..781a21d 100644 --- a/tree/BinaryLinkedList.c +++ b/tree/BinaryLinkedList.c @@ -4,83 +4,83 @@ #include void CreateBinaryLinkedList(BiNode * b){ - printf("请选择创建方式(前序创建输入1,中序创建输入2,后序创建输入3):\n"); + printf("璇烽夋嫨鍒涘缓鏂瑰紡锛堝墠搴忓垱寤鸿緭鍏1锛屼腑搴忓垱寤鸿緭鍏2锛屽悗搴忓垱寤鸿緭鍏3锛夛細\n"); int a; scanf("%d", &a); - //开始创建二叉树 + //寮濮嬪垱寤轰簩鍙夋爲 if(a == 1){ - printf("开始前序创建二叉树\n"); + printf("寮濮嬪墠搴忓垱寤轰簩鍙夋爲\n"); PreCreate(b); } else if(a == 2){ - printf("开始中序创建二叉树\n"); + printf("寮濮嬩腑搴忓垱寤轰簩鍙夋爲\n"); InCreate(b); } else if(a == 3){ - printf("开始后序创建二叉树\n"); + printf("寮濮嬪悗搴忓垱寤轰簩鍙夋爲\n"); PostCreate(b); } else{ - printf("输入的创建方式有误,无法创建"); + printf("杈撳叆鐨勫垱寤烘柟寮忔湁璇紝鏃犳硶鍒涘缓"); return; } - printf("创建完成\n"); + printf("鍒涘缓瀹屾垚\n"); } -//三种创建二叉树(前序中序后序)的函数实现 +//涓夌鍒涘缓浜屽弶鏍戯紙鍓嶅簭涓簭鍚庡簭锛夌殑鍑芥暟瀹炵幇 void PreCreate(BiNode * b){ ElementType e; - printf("请输入结点的id(如果输入-1,那么就不在这个枝干上创建结点):\n"); + printf("璇疯緭鍏ョ粨鐐圭殑id(濡傛灉杈撳叆-1锛岄偅涔堝氨涓嶅湪杩欎釜鏋濆共涓婂垱寤虹粨鐐):\n"); scanf("%d",&e.id); - if(e.id == -1){ //如果用户输入了-1,那么将该结点的状态设为-999999,等函数返回之后释放该节点 + if(e.id == -1){ //濡傛灉鐢ㄦ埛杈撳叆浜-1锛岄偅涔堝皢璇ョ粨鐐圭殑鐘舵佽涓-999999锛岀瓑鍑芥暟杩斿洖涔嬪悗閲婃斁璇ヨ妭鐐 /* - 为什么这里不直接释放结点并置空呢 - 比如这里写free(b); + 涓轰粈涔堣繖閲屼笉鐩存帴閲婃斁缁撶偣骞剁疆绌哄憿 + 姣斿杩欓噷鍐檉ree(b); b = NULL; - 这样做的确可以free掉b。但是却无法执行第二句,也就是将b指针指向NULL - 后果是b成为一个野指针 - 野指针的错误非常危险。导致后面无法使用if(b == NULL)这个条件判断 - 也就是说后面的程序将无法判断b是否为空指针 - - 原因待考证,我猜测应该是因为b在该函数中是一个形参。将形参这个空指针指向null恐怕不行 - 但是可以free掉这个形参。 - - 最后要指出的是: - 1.野指针非常危险,如果free掉某个空间之后,不把该空间置空(赋值为NULL) - 那么后面的程序就无法通过if语句判断该空间是否被释放。 - 2.解决该问题的方法是,free掉某空间之后(C++为delete某个空间),立刻将该空间指向NULL - 以避免野指针带来的极大麻烦。 - 3.如果遇到这里的情况,某空间是一个形参。那么就不能通过指向NULL来将该形参对应的背后的 - 实参指针置空。但是却可以通过free(C++为delete),将形参对应背后的实参内存释放。 - 4.解决问题3的方法是 将形参改成 指向指针的指针。这样做就太过于麻烦了。 - 5.重要的事情说3遍 有malloc就有free,有free就有NULL! - 有malloc就有free,有free就有NULL! - 有malloc就有free,有free就有NULL! + 杩欐牱鍋氱殑纭彲浠ree鎺塨銆備絾鏄嵈鏃犳硶鎵ц绗簩鍙ワ紝涔熷氨鏄皢b鎸囬拡鎸囧悜NULL + 鍚庢灉鏄痓鎴愪负涓涓噹鎸囬拡 + 閲庢寚閽堢殑閿欒闈炲父鍗遍櫓銆傚鑷村悗闈㈡棤娉曚娇鐢╥f(b == NULL)杩欎釜鏉′欢鍒ゆ柇 + 涔熷氨鏄鍚庨潰鐨勭▼搴忓皢鏃犳硶鍒ゆ柇b鏄惁涓虹┖鎸囬拡 + + 鍘熷洜寰呰冭瘉锛屾垜鐚滄祴搴旇鏄洜涓篵鍦ㄨ鍑芥暟涓槸涓涓舰鍙傘傚皢褰㈠弬杩欎釜绌烘寚閽堟寚鍚憂ull鎭愭曚笉琛 + 浣嗘槸鍙互free鎺夎繖涓舰鍙傘 + + 鏈鍚庤鎸囧嚭鐨勬槸锛 + 1.閲庢寚閽堥潪甯稿嵄闄╋紝濡傛灉free鎺夋煇涓┖闂翠箣鍚庯紝涓嶆妸璇ョ┖闂寸疆绌猴紙璧嬪间负NULL锛 + 閭d箞鍚庨潰鐨勭▼搴忓氨鏃犳硶閫氳繃if璇彞鍒ゆ柇璇ョ┖闂存槸鍚﹁閲婃斁銆 + 2.瑙e喅璇ラ棶棰樼殑鏂规硶鏄紝free鎺夋煇绌洪棿涔嬪悗(C++涓篸elete鏌愪釜绌洪棿)锛岀珛鍒诲皢璇ョ┖闂存寚鍚慛ULL + 浠ラ伩鍏嶉噹鎸囬拡甯︽潵鐨勬瀬澶ч夯鐑︺ + 3.濡傛灉閬囧埌杩欓噷鐨勬儏鍐碉紝鏌愮┖闂存槸涓涓舰鍙傘傞偅涔堝氨涓嶈兘閫氳繃鎸囧悜NULL鏉ュ皢璇ュ舰鍙傚搴旂殑鑳屽悗鐨 + 瀹炲弬鎸囬拡缃┖銆備絾鏄嵈鍙互閫氳繃free(C++涓篸elete),灏嗗舰鍙傚搴旇儗鍚庣殑瀹炲弬鍐呭瓨閲婃斁銆 + 4.瑙e喅闂3鐨勬柟娉曟槸 灏嗗舰鍙傛敼鎴 鎸囧悜鎸囬拡鐨勬寚閽堛傝繖鏍峰仛灏卞お杩囦簬楹荤儲浜嗐 + 5.閲嶈鐨勪簨鎯呰3閬 鏈塵alloc灏辨湁free锛屾湁free灏辨湁NULL锛 + 鏈塵alloc灏辨湁free锛屾湁free灏辨湁NULL锛 + 鏈塵alloc灏辨湁free锛屾湁free灏辨湁NULL锛 */ b->status = -999999; return; } - printf("请输入结点的name:\n"); + printf("璇疯緭鍏ョ粨鐐圭殑name:\n"); scanf("%s",e.name); - //以下 - b->data = e; //将输入的结点信息赋值给当前结点的数据域 - b->lchild = (BiNode *)malloc(sizeof(BiNode)); //给左孩子指针分配内存 - PreCreate(b->lchild); //递归创建左子树 - if(b->lchild->status == -999999){ //如果创建失败,那么删除刚刚分配的左孩子的内存,并且将指针置空 + //浠ヤ笅 + b->data = e; //灏嗚緭鍏ョ殑缁撶偣淇℃伅璧嬪肩粰褰撳墠缁撶偣鐨勬暟鎹煙 + b->lchild = (BiNode *)malloc(sizeof(BiNode)); //缁欏乏瀛╁瓙鎸囬拡鍒嗛厤鍐呭瓨 + PreCreate(b->lchild); //閫掑綊鍒涘缓宸﹀瓙鏍 + if(b->lchild->status == -999999){ //濡傛灉鍒涘缓澶辫触锛岄偅涔堝垹闄ゅ垰鍒氬垎閰嶇殑宸﹀瀛愮殑鍐呭瓨锛屽苟涓斿皢鎸囬拡缃┖ free(b->lchild); b->lchild = NULL; } - b->rchild = (BiNode *)malloc(sizeof(BiNode)); //给右孩子指针分配内存 - PreCreate(b->rchild); //递归创建右子树 - if(b->rchild->status == -999999){ //如果创建失败,那么删除刚刚分配的右孩子的内存,并且将指针置空 + b->rchild = (BiNode *)malloc(sizeof(BiNode)); //缁欏彸瀛╁瓙鎸囬拡鍒嗛厤鍐呭瓨 + PreCreate(b->rchild); //閫掑綊鍒涘缓鍙冲瓙鏍 + if(b->rchild->status == -999999){ //濡傛灉鍒涘缓澶辫触锛岄偅涔堝垹闄ゅ垰鍒氬垎閰嶇殑鍙冲瀛愮殑鍐呭瓨锛屽苟涓斿皢鎸囬拡缃┖ free(b->rchild); b->rchild = NULL; } @@ -92,47 +92,47 @@ void PostCreate(BiNode * b){ } -//以下是遍历算法 +//浠ヤ笅鏄亶鍘嗙畻娉 void TraverseBinaryTree(BiNode *b){ - printf("请选择遍历方式(前序遍历输入1,中序遍历输入2,后序遍历输入3\n前序非递归遍历输入4,中序非递归遍历输入5,后序非递归遍历输入6):\n"); + printf("璇烽夋嫨閬嶅巻鏂瑰紡锛堝墠搴忛亶鍘嗚緭鍏1锛屼腑搴忛亶鍘嗚緭鍏2锛屽悗搴忛亶鍘嗚緭鍏3\n鍓嶅簭闈為掑綊閬嶅巻杈撳叆4锛屼腑搴忛潪閫掑綊閬嶅巻杈撳叆5锛屽悗搴忛潪閫掑綊閬嶅巻杈撳叆6锛夛細\n"); int a; scanf("%d", &a); - //开始遍历二叉树 + //寮濮嬮亶鍘嗕簩鍙夋爲 if(a == 1){ - printf("开始前序遍历二叉树\n"); + printf("寮濮嬪墠搴忛亶鍘嗕簩鍙夋爲\n"); PreOrderTraverse(b); } else if(a == 2){ - printf("开始中序遍历二叉树\n"); + printf("寮濮嬩腑搴忛亶鍘嗕簩鍙夋爲\n"); InOrderTraverse(b); } else if(a == 3){ - printf("开始后序遍历二叉树\n"); + printf("寮濮嬪悗搴忛亶鍘嗕簩鍙夋爲\n"); PostOrderTraverse(b); } else if(a == 4){ - printf("开始前序非递归遍历二叉树\n"); + printf("寮濮嬪墠搴忛潪閫掑綊閬嶅巻浜屽弶鏍慭n"); PreOrderTraverse_Re(b); } else if(a == 5){ - printf("开始中序非递归遍历二叉树\n"); + printf("寮濮嬩腑搴忛潪閫掑綊閬嶅巻浜屽弶鏍慭n"); InOrderTraverse_Re(b); } else if(a == 6){ - printf("开始后序非递归遍历二叉树\n"); + printf("寮濮嬪悗搴忛潪閫掑綊閬嶅巻浜屽弶鏍慭n"); PostOrderTraverse_Re(b); } else{ - printf("输入的遍历方式有误,无法遍历"); + printf("杈撳叆鐨勯亶鍘嗘柟寮忔湁璇紝鏃犳硶閬嶅巻"); return; } - printf("遍历完成\n"); + printf("閬嶅巻瀹屾垚\n"); } void PreOrderTraverse(BiNode *b){ - if(b == NULL) //对应上面的一大串注释。这里就是通过if语句判断指针是否为NULL + if(b == NULL) //瀵瑰簲涓婇潰鐨勪竴澶т覆娉ㄩ噴銆傝繖閲屽氨鏄氳繃if璇彞鍒ゆ柇鎸囬拡鏄惁涓篘ULL return; printf("%d\t%s\n",b->data.id,b->data.name); PreOrderTraverse(b->lchild); @@ -155,48 +155,48 @@ void PostOrderTraverse(BiNode *b){ void InOrderTraverse_Re(BiNode *b){ - //中序遍历的非递归算法 - //王道考研数据结构 以中序遍历为例讲解算法思想。那么就先实现非递归的中序遍历。 - //算法思想: - //1.初始时扫描根结点进栈,并扫描根结点的所有左侧结点并将它们一一进栈 - //2.出栈一个结点,访问它(在这里是打印它) - //3.扫描该节点的右孩子结点将其进栈(只扫描它的右孩子!不是所有) - //4.依次扫描右孩子结点的左侧结点并将它们一一进栈(其实就是第1步的重复。将右孩子结点看作了根结点) - //5.反复该过程直到栈空为止。 - - LinkedStack *s = (LinkedStack*)malloc(sizeof(LinkedStack)); //创建一个链栈 + //涓簭閬嶅巻鐨勯潪閫掑綊绠楁硶 + //鐜嬮亾鑰冪爺鏁版嵁缁撴瀯 浠ヤ腑搴忛亶鍘嗕负渚嬭瑙g畻娉曟濇兂銆傞偅涔堝氨鍏堝疄鐜伴潪閫掑綊鐨勪腑搴忛亶鍘嗐 + //绠楁硶鎬濇兂锛 + //1.鍒濆鏃舵壂鎻忔牴缁撶偣杩涙爤锛屽苟鎵弿鏍圭粨鐐圭殑鎵鏈夊乏渚х粨鐐瑰苟灏嗗畠浠竴涓杩涙爤 + //2.鍑烘爤涓涓粨鐐癸紝璁块棶瀹冿紙鍦ㄨ繖閲屾槸鎵撳嵃瀹冿級 + //3.鎵弿璇ヨ妭鐐圭殑鍙冲瀛愮粨鐐瑰皢鍏惰繘鏍堬紙鍙壂鎻忓畠鐨勫彸瀛╁瓙锛佷笉鏄墍鏈夛級 + //4.渚濇鎵弿鍙冲瀛愮粨鐐圭殑宸︿晶缁撶偣骞跺皢瀹冧滑涓涓杩涙爤锛堝叾瀹炲氨鏄1姝ョ殑閲嶅銆傚皢鍙冲瀛愮粨鐐圭湅浣滀簡鏍圭粨鐐癸級 + //5.鍙嶅璇ヨ繃绋嬬洿鍒版爤绌轰负姝€ + + LinkedStack *s = (LinkedStack*)malloc(sizeof(LinkedStack)); //鍒涘缓涓涓摼鏍 InitLinkedStack(s); - BiNode * temp = b; //创建一个中间变量保存形参方便后续操作 - while(temp != NULL || s->length != 0){ //只要结点存在或者栈非空,那么就继续循环 + BiNode * temp = b; //鍒涘缓涓涓腑闂村彉閲忎繚瀛樺舰鍙傛柟渚垮悗缁搷浣 + while(temp != NULL || s->length != 0){ //鍙缁撶偣瀛樺湪鎴栬呮爤闈炵┖锛岄偅涔堝氨缁х画寰幆 if(temp != NULL){ - Push(s,*temp); //第一步:让根节点进栈 - temp = temp->lchild; //通过循环让根节点的左孩子们进栈 + Push(s,*temp); //绗竴姝ワ細璁╂牴鑺傜偣杩涙爤 + temp = temp->lchild; //閫氳繃寰幆璁╂牴鑺傜偣鐨勫乏瀛╁瓙浠繘鏍 } - else{ //else代表结点空了 + else{ //else浠h〃缁撶偣绌轰簡 BiNode * t = (BiNode*)malloc(sizeof(BiNode)); - Pop(s,t); //注意 这里不是将空结点扔出去。空结点根本就没有进栈 - // 这里是出栈一个真实的结点。 - //出栈真实的那个结点,存在了临时变量t里面 + Pop(s,t); //娉ㄦ剰 杩欓噷涓嶆槸灏嗙┖缁撶偣鎵斿嚭鍘汇傜┖缁撶偣鏍规湰灏辨病鏈夎繘鏍 + // 杩欓噷鏄嚭鏍堜竴涓湡瀹炵殑缁撶偣銆 + //鍑烘爤鐪熷疄鐨勯偅涓粨鐐癸紝瀛樺湪浜嗕复鏃跺彉閲弔閲岄潰 printf("%d\t%s\n",t->data.id,t->data.name); - temp = t->rchild; //用一个临时变量t保存该结点,然后将temp赋值给t的右孩子 - free(t); //用完空间之后记得释放,并且将指针置空。避免产生野指针 + temp = t->rchild; //鐢ㄤ竴涓复鏃跺彉閲弔淇濆瓨璇ョ粨鐐癸紝鐒跺悗灏唗emp璧嬪肩粰t鐨勫彸瀛╁瓙 + free(t); //鐢ㄥ畬绌洪棿涔嬪悗璁板緱閲婃斁锛屽苟涓斿皢鎸囬拡缃┖銆傞伩鍏嶄骇鐢熼噹鎸囬拡 t = NULL; } } free(s); } -void PreOrderTraverse_Re(BiNode *b){ //前序遍历的非递归算法 +void PreOrderTraverse_Re(BiNode *b){ //鍓嶅簭閬嶅巻鐨勯潪閫掑綊绠楁硶 - //和中序遍历差不多。就是代码顺序有改变 我把注释都删了 + //鍜屼腑搴忛亶鍘嗗樊涓嶅銆傚氨鏄唬鐮侀『搴忔湁鏀瑰彉 鎴戞妸娉ㄩ噴閮藉垹浜 LinkedStack *s = (LinkedStack*)malloc(sizeof(LinkedStack)); InitLinkedStack(s); BiNode * temp = b; while(temp != NULL || s->length != 0){ if(temp != NULL){ - printf("%d\t%s\n",temp->data.id,temp->data.name); //和中序遍历不同顺序。这里是先打印 + printf("%d\t%s\n",temp->data.id,temp->data.name); //鍜屼腑搴忛亶鍘嗕笉鍚岄『搴忋傝繖閲屾槸鍏堟墦鍗 Push(s,*temp); temp = temp->lchild; } @@ -210,7 +210,7 @@ void PreOrderTraverse_Re(BiNode *b){ //前 } free(s); } -void PostOrderTraverse_Re(BiNode *b){ //后序遍历的非递归算法 注意 这里有坑。后序遍历的非递归算法比较复杂。暂不实现 +void PostOrderTraverse_Re(BiNode *b){ //鍚庡簭閬嶅巻鐨勯潪閫掑綊绠楁硶 娉ㄦ剰 杩欓噷鏈夊潙銆傚悗搴忛亶鍘嗙殑闈為掑綊绠楁硶姣旇緝澶嶆潅銆傛殏涓嶅疄鐜 ; } diff --git a/tree/BinaryLinkedList.h b/tree/BinaryLinkedList.h index 16191d8..d17cef4 100644 --- a/tree/BinaryLinkedList.h +++ b/tree/BinaryLinkedList.h @@ -1,33 +1,33 @@ -//二叉链表(二叉树的链式存储结构) +//浜屽弶閾捐〃锛堜簩鍙夋爲鐨勯摼寮忓瓨鍌ㄧ粨鏋勶級 #ifndef BINARYLINKEDLIST_H_INCLUDED #define BINARYLINKEDLIST_H_INCLUDED #include "DataElement.h" -//定义二叉链表结点的存储结构 +//瀹氫箟浜屽弶閾捐〃缁撶偣鐨勫瓨鍌ㄧ粨鏋 typedef struct BiNode{ - int key; //按照完全二叉树的方法给树的结点编号 - int status; //判断该结点是否成功创建 - ElementType data; //数据域 - struct BiNode * lchild; //左孩子(指针域) - struct BiNode * rchild; //右孩子(指针域) + int key; //鎸夌収瀹屽叏浜屽弶鏍戠殑鏂规硶缁欐爲鐨勭粨鐐圭紪鍙 + int status; //鍒ゆ柇璇ョ粨鐐规槸鍚︽垚鍔熷垱寤 + ElementType data; //鏁版嵁鍩 + struct BiNode * lchild; //宸﹀瀛愶紙鎸囬拡鍩燂級 + struct BiNode * rchild; //鍙冲瀛愶紙鎸囬拡鍩燂級 }BiNode; -//以b为根节点,创建二叉树 +//浠涓烘牴鑺傜偣锛屽垱寤轰簩鍙夋爲 void CreateBinaryLinkedList(BiNode * b); -//以下3个函数是CreateBinaryLinkedList的子函数,用来配合它使用的 -void PreCreate(BiNode * b); //前序创建 -void InCreate(BiNode * b); //中序创建 -void PostCreate(BiNode * b); //后序创建 +//浠ヤ笅3涓嚱鏁版槸CreateBinaryLinkedList鐨勫瓙鍑芥暟锛岀敤鏉ラ厤鍚堝畠浣跨敤鐨 +void PreCreate(BiNode * b); //鍓嶅簭鍒涘缓 +void InCreate(BiNode * b); //涓簭鍒涘缓 +void PostCreate(BiNode * b); //鍚庡簭鍒涘缓 -//以某种顺序遍历二叉树 +//浠ユ煇绉嶉『搴忛亶鍘嗕簩鍙夋爲 void TraverseBinaryTree(BiNode *b); -//以下6个函数是TraverseBinaryTree的子函数. -void PreOrderTraverse(BiNode *b); //前序遍历 -void InOrderTraverse(BiNode *b); //中序遍历 -void PostOrderTraverse(BiNode *b); //后序遍历 +//浠ヤ笅6涓嚱鏁版槸TraverseBinaryTree鐨勫瓙鍑芥暟. +void PreOrderTraverse(BiNode *b); //鍓嶅簭閬嶅巻 +void InOrderTraverse(BiNode *b); //涓簭閬嶅巻 +void PostOrderTraverse(BiNode *b); //鍚庡簭閬嶅巻 -void InOrderTraverse_Re(BiNode *b); //中序遍历的非递归算法 -void PreOrderTraverse_Re(BiNode *b); //前序遍历的非递归算法 -void PostOrderTraverse_Re(BiNode *b); //后序遍历的非递归算法 注意 这里有坑。后序遍历的非递归算法比较复杂。暂不实现 +void InOrderTraverse_Re(BiNode *b); //涓簭閬嶅巻鐨勯潪閫掑綊绠楁硶 +void PreOrderTraverse_Re(BiNode *b); //鍓嶅簭閬嶅巻鐨勯潪閫掑綊绠楁硶 +void PostOrderTraverse_Re(BiNode *b); //鍚庡簭閬嶅巻鐨勯潪閫掑綊绠楁硶 娉ㄦ剰 杩欓噷鏈夊潙銆傚悗搴忛亶鍘嗙殑闈為掑綊绠楁硶姣旇緝澶嶆潅銆傛殏涓嶅疄鐜 #endif // BINARYLINKEDLIST_H_INCLUDED diff --git a/tree/DataElement.h b/tree/DataElement.h index b756720..e735817 100644 --- a/tree/DataElement.h +++ b/tree/DataElement.h @@ -3,7 +3,7 @@ #define DATAELEMENT_H_INCLUDED #define MAX_SIZE 255 -//定义数据元素 +//瀹氫箟鏁版嵁鍏冪礌 typedef struct{ int id; char name[255]; diff --git a/tree/LinkedStack.c b/tree/LinkedStack.c index 6325e76..f3685dd 100644 --- a/tree/LinkedStack.c +++ b/tree/LinkedStack.c @@ -1,7 +1,7 @@ #include "LinkedStack.h" #include -//初始化栈 +//鍒濆鍖栨爤 void InitLinkedStack(LinkedStack * s){ s->Top = NULL; s->length = 0; @@ -9,7 +9,7 @@ void InitLinkedStack(LinkedStack * s){ int Push(LinkedStack * s, BiNode e){ - StackNode * node = (StackNode *)malloc(sizeof(StackNode)); //创建一个结点,节点里存放新压入元素e的信息 + StackNode * node = (StackNode *)malloc(sizeof(StackNode)); //鍒涘缓涓涓粨鐐癸紝鑺傜偣閲屽瓨鏀炬柊鍘嬪叆鍏冪礌e鐨勪俊鎭 node->data = e; node->next = s->Top; s->Top = node; diff --git a/tree/LinkedStack.h b/tree/LinkedStack.h index 79bc982..d6bbed1 100644 --- a/tree/LinkedStack.h +++ b/tree/LinkedStack.h @@ -1,31 +1,31 @@ #ifndef LINKEDSTACK_H_INCLUDED #define LINKEDSTACK_H_INCLUDED -//链栈 -//这个链栈用来非递归遍历二叉树而特别制造 +//閾炬爤 +//杩欎釜閾炬爤鐢ㄦ潵闈為掑綊閬嶅巻浜屽弶鏍戣岀壒鍒埗閫 #include #include #include "BinaryLinkedList.h" -//结点 注意data就是二叉树的结点 +//缁撶偣 娉ㄦ剰data灏辨槸浜屽弶鏍戠殑缁撶偣 typedef struct StackNode{ BiNode data; struct StackNode * next; }StackNode; -//存放栈顶指针的数据结构。里面有栈顶指针和栈的length +//瀛樻斁鏍堥《鎸囬拡鐨勬暟鎹粨鏋勩傞噷闈㈡湁鏍堥《鎸囬拡鍜屾爤鐨刲ength typedef struct LinkedStack{ StackNode * Top; int length; }LinkedStack; -//初始化栈 +//鍒濆鍖栨爤 void InitLinkedStack(LinkedStack * s); -//压栈 将元素e压入栈中 返回值int为0代表失败,1为成功。 +//鍘嬫爤 灏嗗厓绱爀鍘嬪叆鏍堜腑 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int Push(LinkedStack * s, BiNode e); -//删除栈S中的栈顶元素,并用e来返回弹出的值 返回值int为0代表失败,1为成功。 +//鍒犻櫎鏍圫涓殑鏍堥《鍏冪礌锛屽苟鐢╡鏉ヨ繑鍥炲脊鍑虹殑鍊 杩斿洖鍊糹nt涓0浠h〃澶辫触锛1涓烘垚鍔熴 int Pop(LinkedStack * s, BiNode * e); -//判断栈是否为空 +//鍒ゆ柇鏍堟槸鍚︿负绌 void IsStackEmpty(LinkedStack * s); -- Gitee