二级链表的定义和用法
来源:互联网 发布:电脑一般装什么软件 编辑:程序博客网 时间:2024/06/05 09:25
- /**
- * 通用平台逻辑模块组
- * 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;
- }
0 0
- 二级链表的定义和用法
- 二级指针的用法
- 二级指针的用法
- 二级指针的用法
- 二级指针的用法
- cellpadding的用法和定义
- 枚举的定义和用法
- mysqli_query 的定义和用法
- 接口的定义和用法
- 语句的定义和用法
- argc和argv的定义和用法
- 链表的一级指针和二级指针
- C++二级指针的用法
- 二级目录ExpandableListView的用法
- 二级列表的简单用法
- 宏定义符号#和##的用法
- 宏定义和const的用法
- indexof函数的定义和用法
- 使用eclipse编辑android xml文件时 自动提示功能
- 【无线互联】ios开发之MKNetworkKit的介绍和使用
- iOS6和iOS7的简单适配
- 系统入门(14):Android入门之从输入设备中获取消息
- iOS 已有工程创建git
- 二级链表的定义和用法
- java内存管理机制+垃圾回收机制(*****)
- centos6.5通过yum安装redmine
- 读书笔记_Effective C++_习惯C++
- The specified virtual disk needs repair.
- php取整函数
- 妈妈教女程序猿如何找到好男人
- iframe自适应高度的多种方法方法小结
- pthread cond 生产者消费者(复习)