首页 > 代码库 > 单向链表 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。