二级链表的定义和用法

来源:互联网 发布:电脑一般装什么软件 编辑:程序博客网 时间:2024/06/05 09:25
  1. /**
  2.  * 通用平台逻辑模块组
  3.  * Copyright (c) 2012 xxxx
  4.  * 
  5.  * @file linkers.c
  6.  * @brief 二级链表
  7.  * @author 
  8.  * @date 2012/10/
  9.  * 
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>

  15. /**
  16.  * @brief 二级链表
  17.  */
  18. typedef struct _Menu Menu;
  19. typedef struct _ChildMenu ChildMenu;

  20. /// < 第二级链表
  21. struct _ChildMenu
  22. {
  23.     char * m_name;
  24.     ChildMenu * cNext;
  25. };

  26. /// < 第一级链表
  27. struct _Menu
  28. {
  29.     char * m_name;
  30.     Menu * pMenu;

  31.     int count;
  32.     ChildMenu * pChildMenu;
  33. };

  34. /// < 初始化链表
  35. Menu * initMenu()
  36. {
  37.     Menu * pHead = NULL;
  38.     Menu * pNext = NULL;
  39.     ChildMenu * pcHead = NULL;

  40.     int i , j;

  41.     for (= 0; i < 2; i)
  42.     {
  43.         Menu * pMenu = (Menu *)malloc(sizeof(Menu));
  44.         if (!pMenu)
  45.             return NULL;
  46.         memset(pMenu, 0, sizeof(Menu));

  47.         pMenu->m_name = (char *)malloc(3);
  48.         if (!pMenu->m_name)
  49.             return NULL;
  50.         memset(pMenu->m_name, 0, 3);
  51.         strcpy(pMenu->m_name, "a");

  52.         pMenu->count = 2;

  53.         if (== i)
  54.         {
  55.             pHead = pNext = pMenu;
  56.             pMenu->pMenu = NULL;
  57.         }
  58.         else
  59.         {
  60.             pNext->pMenu = pMenu;
  61.             pMenu->pMenu = NULL;
  62.             pNext = pMenu;
  63.         }

  64.         for (= 0; j < pMenu->count; j)
  65.         {
  66.             ChildMenu * pChildMenu = (ChildMenu *)malloc(sizeof(ChildMenu));
  67.             if (!pChildMenu)
  68.                 return NULL;
  69.             pChildMenu->m_name = (char *)malloc(3);
  70.             if (!pChildMenu->m_name)
  71.                 return NULL;
  72.             memset(pChildMenu->m_name, 0, 3);
  73.             strcpy(pChildMenu->m_name, "b");

  74.             if (== j)
  75.             {
  76.                 pNext->pChildMenu = pChildMenu;
  77.                 pcHead = pChildMenu;
  78.                 pChildMenu->cNext = NULL;
  79.             }
  80.             else
  81.             {
  82.                 pcHead->cNext = pChildMenu;
  83.                 pChildMenu->cNext = NULL;
  84.                 pcHead = pChildMenu;
  85.             }
  86.         }
  87.     }

  88.     return pHead;
  89. }

  90. /// < 二级链表的遍历
  91. void traverse_linker(const Menu * head)
  92. {
  93.     const Menu * p = head;
  94.     ChildMenu * q;
  95.     int i;

  96.     if (!head)
  97.         return ;

  98.     while (p)
  99.     {
  100.         printf("-%s\n", p->m_name);
  101.         q = p->pChildMenu;
  102.         for (= 0; i < p->count; i) /// < 有个数就是好!
  103.         {
  104.             printf(" --%s", q->m_name);
  105.             q = q->cNext;
  106.         }
  107.         putchar('\n');

  108.         p = p->pMenu;
  109.     }
  110. }

  111. /// < 二级链表的释放 - 从头开始
  112. void free_linker(Menu ** head)
  113. {
  114.     Menu * firstgo = NULL; /// < 负责一级链表
  115.     ChildMenu * childgo = NULL; /// < 负责二级链表
  116.     Menu * firstNext = NULL; /// < 指向一级链表的后一个
  117.     ChildMenu * childNext = NULL; /// < 指向二级链表后一个
  118.     if (!(*head))
  119.         return;
  120.     firstgo = *head;
  121.     while (firstgo)
  122.     {
  123.         firstNext = firstgo->pMenu;
  124.         childgo = firstgo->pChildMenu;
  125.         while (childgo)
  126.         {
  127.             /// < 释放第二级链表
  128.             childNext = childgo->cNext;
  129.             
  130.             free(childgo->m_name);
  131.             free(childgo);
  132.             /// < 下一个
  133.             childgo = childNext;
  134.         }
  135.         
  136.         /// < 释放第一级链表
  137.         free(firstgo->m_name);
  138.         free(firstgo);
  139.         /// < 下一个
  140.         firstgo = firstNext;
  141.     }
  142.     *head = NULL;
  143. }

  144. /**
  145.  * @brief 鉴于所使用的环境,carbide.c ;所以用gcc调试,用symbian os application进行内存泄漏检查!
  146.  * 突然发现symbian模拟器运行程序挺爽的,关闭后检查你的内存泄漏。挺好,应该还有很多工具可以检查,目前
  147.  * 这个不错!不过调试的话,看内存,看变量就可以了,不需要去打印哈!你懂的..
  148.  */
  149. int main()
  150. {
  151.     Menu * pMenu = initMenu();

  152.     /* printf("%s ", pMenu->m_name);
  153.        printf("%d\n", pMenu->count);
  154.        printf(" -->%s -->", pMenu->pChildMenu->m_name);
  155.        printf("%s\n", pMenu->pChildMenu->cNext->m_name);

  156.        printf("%s ", pMenu->pMenu->m_name);
  157.        printf("%d\n", pMenu->pMenu->count);
  158.        printf(" -->%s -->", pMenu->pMenu->pChildMenu->m_name);
  159.        printf("%s\n", pMenu->pMenu->pChildMenu->cNext->m_name);
  160.        */
  161.     traverse_linker(pMenu);
  162.     free_linker(&pMenu);
  163.     /// < 证明下
  164.     traverse_linker(pMenu);
  165.     return 0;
  166. }
0 0
原创粉丝点击