码迷,mamicode.com
首页 > 其他好文 > 详细

单向链表 malloc与free

时间:2014-10-23 23:57:44      阅读:445      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   使用   sp   文件   数据   div   

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

 

单向链表 malloc与free

标签:style   blog   color   ar   使用   sp   文件   数据   div   

原文地址:http://www.cnblogs.com/adalovelace/p/4047049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!