首页 > 代码库 > 单向链表 malloc与free

单向链表 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 #endif147 //---------------------------------------------------------------------------------------------------------148 149 150 151 152 153 154 //链表知识点-----------------------------------------------------------------------------------------------155 //1个接着1个添加结点156 #if 0157     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 //-------

 

单向链表 malloc与free