zoukankan      html  css  js  c++  java
  • 单向链表 malloc与free

      1 这个是头文件,建立成.h
      2 
      3 #include "windows.h"
      4 #include "malloc.h"//使用函数malloc,必须要导入这个头文件.
      5 
      6 
      7 
      8 //创建普通的一个类型为USER的结构体
      9 struct USER
     10 {
     11     DWORD nID;            //因为这里使用了windows.h 的头文件
     12     CHAR nNAME[0X20];    //DWORD CHAR 都是一个宏.
     13     DWORD nLEVEL;        //typedef unsigned long DWORD; typedef char CHAR;
     14 };    //结构体定义完以后一定要加 ; 号.
     15 
     16 
     17 //创建一个结点类型的结构体名字为 nLinked,这个结构体里面也有一个指针.
     18 struct nLinked
     19 {
     20     CHAR nName[0x20];
     21     DWORD nAge;
     22     DWORD nNum;
     23     struct nLinked* pFllow;        //这个pFllow的类型是struct nLinked* .
     24     //可以看出,第3个元素是一个指向struct nLinked 类型的指针.
     25     //通过struct nLinked{ }这个结构体里面有一个元素可以找到其他的struct nLinked类型的结构体的首地址.
     26 };
     27 
     28 extern    nLinked* pLinkedBase;
     29 
     30 
     31 //创建数据与内存空间的程序: 1.为结点分配内存单元 2.把数据写入结点中.
     32 nLinked* CreateNew(IN DWORD Age, IN DWORD Num,IN CHAR* Name)
     33 {
     34     nLinked* pTemp;//创建一个临时作为中转用的指针
     35     pTemp = (nLinked*)malloc(sizeof(nLinked));    //1.为结点分配内存单元
     36     memset(pTemp, 0, sizeof(pTemp));            //2.把数据写入结点中.
     37     pTemp->nAge = Age;                            //写数据
     38     strcpy(pTemp->nName, Name);                    //写数据
     39     pTemp->nNum = Num;                            //写数据
     40     pTemp->pFllow = NULL;                        //写数据
     41     
     42     return pTemp;
     43 }
     44 
     45 
     46 //插入数据的函数
     47 bool InserNew(nLinked* pInser)
     48 {
     49     nLinked* pTemp;                    //定义一个结点类型的指针
     50     pTemp = pLinkedBase;            //首先把指针指向第一个结点
     51 
     52     if(!pTemp)                        //如果第一个结点为空的话,说明没有链表开始的结点,
     53     {                                //插入的数据就可以作为链表的第1个结点.
     54         pLinkedBase = pInser;
     55 
     56         return 1;
     57     }
     58     while(pTemp->pFllow)            //如果不是第1个结点的话,且不是最后1个结点,执行下面的语句
     59     {
     60         pTemp = pTemp->pFllow;        //从pLinkedBase一直往下的结点走,走到某个最后一个结点为止.
     61     }                                //最后一个结点的存放的存放的指针,肯定为0
     62     pTemp->pFllow = pInser;            //把新结点申请的空间的首地址,给了最后一个结点存放好.
     63                                     //新结点就成了最后一个结点了.
     64     return 1;
     65 }
     66 
     67 
     68 
     69 //删除数据的函数
     70 bool Delete(DWORD nNum)
     71 {
     72     nLinked* pTemp;                    //建立一个当前指针,用于指向当前的结点
     73     nLinked* pPro;                    //建立一个临时指针,用于保存上1个结点的地址
     74     
     75     pTemp = pLinkedBase;            //首先把辅助指针指向第一个结点
     76     
     77     if(pTemp->nNum == nNum)            //判断第1个结点是否符合条件.
     78     {                                //因为处理第1个结点和处理其他结点的方式不一样,所以要单独判断
     79         pLinkedBase = pLinkedBase->pFllow;
     80         free(pTemp);
     81         
     82         return 1;
     83     }
     84     else                            //不是第1个结点的话,就用下面的方法
     85     {    
     86             do
     87             {
     88                 pPro = pTemp;                //把pTemp的值给pPro
     89                 pTemp = pPro->pFllow;        //通过pPro->pFllow获得下1个结点的指针,给了pTemp
     90                 if(pTemp->nNum == nNum)        //判断pTemp指向的结点的数据是否符合条件
     91                 {
     92                     pPro->pFllow = pTemp->pFllow;    //如果符合就pTemp当前的结点的下个结点地址赋值给
     93                     free(pTemp);                    //当前的结点的上个结点,然后再释放当前结点的内存空间
     94                     pTemp = NULL;                    
     95 
     96                     return 1;                    
     97                 }
     98             }while(pTemp);                            //条件不满足的话,则遍历循环.
     99         
    100     }
    101     return 1;
    102 }
    103 
    104 //-----------------------------------------------------------------------
    105 //********主函数入口********
    106 int main(int argc, char* argv[])
    107 {
    108 //用程序直接插入数据-------------------------------------------------------------------------
    109 //CreateNew(IN DWORD Age, IN DWORD Num,IN CHAR* Name)
    110     nLinked* Temp;
    111     Temp = CreateNew(29, 01, "刘同学");
    112     InserNew(Temp);
    113 
    114     Temp = CreateNew(28, 02, "翰林");
    115     InserNew(Temp);
    116 
    117     Temp = CreateNew(12, 07, "徐小姐");
    118     InserNew(Temp);
    119 
    120     Temp = CreateNew(35, 03, "面哥");
    121     InserNew(Temp);
    122 
    123     Delete(2);
    124 
    125     return 0;
    126 }
    127 
    128 
    129 
    130 //malloc 和 free函数的知识点------------------------------------------------------------------------------
    131 #if 0   
    132     USER* pUSER;
    133     pUSER = (USER*)malloc(sizeof(USER));   //malloc的函数原型是: _CRTIMP void * __cdecl malloc(size_t)
    134                                            //malloc返回值得类型是 void *
    135     //malloc每次获得的内存块的首地址是不一样的,这里看出获得的空间位置不是固定的.
    136     //malloc的作用类似于C++的new 指令.
    137     memset(pUSER, 0, sizeof(USER));
    138 
    139     free(pUSER);    //free函数的原型是:_CRTIMP void   __cdecl free(void *);
    140                     //free函数的作用是释放当前指针指向的内存块单元的空间.
    141                     //也就是说malloc申请的USER型的内存单元,经过free(pUSER)以后
    142                     //这片内存单元就空闲了出来给其他地方使用了.
    143                     //但是要注意:经过free以后,pUSER还是指向有实际的地址的,但是这个指针
    144                     //所指向的位置是空闲的,所以这个pUSER指针也没有作用了,被称为"悬空指针".
    145                     //类似C++里面的DELETE指令.
    146 #endif
    147 //---------------------------------------------------------------------------------------------------------
    148 
    149 
    150 
    151 
    152 
    153 
    154 //链表知识点-----------------------------------------------------------------------------------------------
    155 //1个接着1个添加结点
    156 #if 0
    157     nLinked* pFirst;    //定义第1个结点的指针
    158     pFirst = (nLinked*)malloc(sizeof(nLinked));//为第1个结点(结构体)申请内存,并获得内存首地址.
    159     memset(pFirst, 0, sizeof(nLinked));
    160 
    161     nLinked* pSecend;    //定义第2个结点的指针
    162     pSecend = (nLinked*)malloc(sizeof(nLinked));//为第2个结点(结构体)申请内存,并获得内存首地址.
    163     memset(pSecend, 0, sizeof(nLinked));
    164 
    165     nLinked* pThird;    //定义第3个结点的指针
    166     pThird = (nLinked*)malloc(sizeof(nLinked));//为第3个结点(结构体)申请内存,并获得内存首地址.
    167     memset(pThird, 0, sizeof(nLinked));
    168 
    169     //给第1个结点数据赋值.
    170     pFirst->nAge = 28;    
    171     pFirst->nNum = 1;
    172     strcpy(pFirst->nName, "Miss伊丽莎白");
    173     pFirst->pFllow = pSecend;
    174     
    175     //给第2个结点数据赋值.
    176     pSecend->nAge = 30;
    177     pSecend->nNum = 2;
    178     strcpy(pSecend->nName, "Mr达西");
    179     pSecend->pFllow = pThird;
    180 
    181     //给第3个结点数据赋值.
    182     pThird->nAge = 29;
    183     pThird->nNum = 3;
    184     strcpy(pThird->nName, "Mr斌格林");
    185     pThird->pFllow = NULL;
    186 #endif        
    187 //这种增加数据的方法很麻烦,可以使用一个程序操作.
    188 //-------
  • 相关阅读:
    Java NIO(六)选择器
    Java NIO(五)套接字通道
    Java NIO(四)文件通道
    Java NIO(三)通道
    Java NIO(二)缓冲区
    Java NIO(一)概述
    gcc中的内嵌汇编语言(Intel i386平台)
    一些汇编指令
    403 Forbidden解决方案
    Linux从入门到放弃
  • 原文地址:https://www.cnblogs.com/adalovelace/p/4047049.html
Copyright © 2011-2022 走看看