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 //-------