- /**
- * 通用平台逻辑模块组
- * Copyright (c) 2012 xxxx
- *
- * @file linkers.c
- * @brief 二级链表
- * @author
- * @date 2012/10/9
- *
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- /**
- * @brief 二级链表
- */
- typedef struct _Menu Menu;
- typedef struct _ChildMenu ChildMenu;
-
- /// < 第二级链表
- struct _ChildMenu
- {
- char * m_name;
- ChildMenu * cNext;
- };
-
- /// < 第一级链表
- struct _Menu
- {
- char * m_name;
- Menu * pMenu;
-
- int count;
- ChildMenu * pChildMenu;
- };
-
- /// < 初始化链表
- Menu * initMenu()
- {
- Menu * pHead = NULL;
- Menu * pNext = NULL;
- ChildMenu * pcHead = NULL;
-
- int i , j;
-
- for (i = 0; i < 2; i)
- {
- Menu * pMenu = (Menu *)malloc(sizeof(Menu));
- if (!pMenu)
- return NULL;
- memset(pMenu, 0, sizeof(Menu));
-
- pMenu->m_name = (char *)malloc(3);
- if (!pMenu->m_name)
- return NULL;
- memset(pMenu->m_name, 0, 3);
- strcpy(pMenu->m_name, "a");
-
- pMenu->count = 2;
-
- if (0 == i)
- {
- pHead = pNext = pMenu;
- pMenu->pMenu = NULL;
- }
- else
- {
- pNext->pMenu = pMenu;
- pMenu->pMenu = NULL;
- pNext = pMenu;
- }
-
- for (j = 0; j < pMenu->count; j)
- {
- ChildMenu * pChildMenu = (ChildMenu *)malloc(sizeof(ChildMenu));
- if (!pChildMenu)
- return NULL;
- pChildMenu->m_name = (char *)malloc(3);
- if (!pChildMenu->m_name)
- return NULL;
- memset(pChildMenu->m_name, 0, 3);
- strcpy(pChildMenu->m_name, "b");
-
- if (0 == j)
- {
- pNext->pChildMenu = pChildMenu;
- pcHead = pChildMenu;
- pChildMenu->cNext = NULL;
- }
- else
- {
- pcHead->cNext = pChildMenu;
- pChildMenu->cNext = NULL;
- pcHead = pChildMenu;
- }
- }
- }
-
- return pHead;
- }
-
- /// < 二级链表的遍历
- void traverse_linker(const Menu * head)
- {
- const Menu * p = head;
- ChildMenu * q;
- int i;
-
- if (!head)
- return ;
-
- while (p)
- {
- printf("-%s\n", p->m_name);
- q = p->pChildMenu;
- for (i = 0; i < p->count; i) /// < 有个数就是好!
- {
- printf(" --%s", q->m_name);
- q = q->cNext;
- }
- putchar('\n');
-
- p = p->pMenu;
- }
- }
-
- /// < 二级链表的释放 - 从头开始
- void free_linker(Menu ** head)
- {
- Menu * firstgo = NULL; /// < 负责一级链表
- ChildMenu * childgo = NULL; /// < 负责二级链表
- Menu * firstNext = NULL; /// < 指向一级链表的后一个
- ChildMenu * childNext = NULL; /// < 指向二级链表后一个
- if (!(*head))
- return;
- firstgo = *head;
- while (firstgo)
- {
- firstNext = firstgo->pMenu;
- childgo = firstgo->pChildMenu;
- while (childgo)
- {
- /// < 释放第二级链表
- childNext = childgo->cNext;
-
- free(childgo->m_name);
- free(childgo);
- /// < 下一个
- childgo = childNext;
- }
-
- /// < 释放第一级链表
- free(firstgo->m_name);
- free(firstgo);
- /// < 下一个
- firstgo = firstNext;
- }
- *head = NULL;
- }
-
- /**
- * @brief 鉴于所使用的环境,carbide.c ;所以用gcc调试,用symbian os application进行内存泄漏检查!
- * 突然发现symbian模拟器运行程序挺爽的,关闭后检查你的内存泄漏。挺好,应该还有很多工具可以检查,目前
- * 这个不错!不过调试的话,看内存,看变量就可以了,不需要去打印哈!你懂的..
- */
- int main()
- {
- Menu * pMenu = initMenu();
-
- /* printf("%s ", pMenu->m_name);
- printf("%d\n", pMenu->count);
- printf(" -->%s -->", pMenu->pChildMenu->m_name);
- printf("%s\n", pMenu->pChildMenu->cNext->m_name);
-
- printf("%s ", pMenu->pMenu->m_name);
- printf("%d\n", pMenu->pMenu->count);
- printf(" -->%s -->", pMenu->pMenu->pChildMenu->m_name);
- printf("%s\n", pMenu->pMenu->pChildMenu->cNext->m_name);
- */
- traverse_linker(pMenu);
- free_linker(&pMenu);
- /// < 证明下
- traverse_linker(pMenu);
- return 0;
- }
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!