2015.12.15 动态内存分配 线性表 单链表
动态内存分配realloc
具体函数:void *realloc(void *, size_t)
其中,第一个『void *』是指返回重新分配的内存空间的首地址;第二个『void *』指针只想的内存区域必须是malloc分配过的;『现在总共需要多少内存空间』。这里需要注意的是,如果realloc没有获取到内存空间,那么必须对之前的内存进行释放。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(int argc, const char * argv[]) { 5 6 char *name = NULL; 7 char temp; 8 int total = 0; 9 10 while (1) { 11 //从终端获取一个字符 12 temp = getchar(); 13 14 //判断这个字符是不是回车键\n 15 if (temp == '\n') { 16 break; 17 } else{ 18 //为这个字符添加一篇内存空间 19 //判断是不是第一次分配内存空间 20 if (name == NULL) { 21 //第一次 22 name = (char *)malloc(1 * sizeof(char)); 23 if (name == NULL) { 24 exit(EXIT_FAILURE); 25 } 26 } else{ 27 //不是第一次,需要在之前的内存空间里面添加 一个字符的空间 28 char *pTemp = NULL; 29 pTemp = (char *)realloc(name, (total+1)*sizeof(char)); 30 if (pTemp == NULL) { 31 //释放掉之前的内存空间 32 free(name); 33 exit(EXIT_FAILURE); 34 } 35 36 name = pTemp; 37 } 38 //保存这个字符 39 *(name + total) = temp; 40 41 total++; 42 } 43 44 } 45 46 printf("%s\n", name); 47 48 free(name); 49 return 0; 50 }
线性表
线性表也叫做顺序表,是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
它的有点是访问方便、直接,但是不足是在插入、删除时需要的内存空间因为不确定而往往比较大。
单链表
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。所以每个结点都是一个结构体。这里需要注意的是,在定义结构体的时候,结构体里面的变量必须是能够明确确定内存空间的。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //定义结点的样式 5 typedef struct node{ 6 char *name;//变量保存的是地址 7 struct node *next;//指向下一个结点的指针 8 }Node; 9 10 void myFree(Node *pHead){ 11 while (pHead != NULL) { 12 //保存下一个结点的地址 13 Node *pTemp = pHead->next; 14 15 //首先释放name对应的内存空间 16 free(pHead->name); 17 18 //再释放结点本身 19 free(pHead); 20 21 //pHead指向下一个 22 pHead = pTemp; 23 } 24 } 25 26 int main(int argc, const char * argv[]) { 27 28 Node *pHead = NULL; 29 Node *pTail = NULL; 30 31 for (int i = 0; i < 3; i++) { 32 int total = 0;//记录当前保存字符的个数 33 34 //创建一个新的结点 35 Node *pTemp = (Node *)malloc(1 * sizeof(Node)); 36 if (pTemp == NULL) { 37 myFree(pHead); 38 exit(EXIT_FAILURE); 39 } 40 41 //输入数据 42 //为name分配一片内存空间 43 printf("请输入名字:"); 44 char character; 45 while (1) { 46 //获取一个字符 47 character = getchar(); 48 49 //判断这个字符是不是'\n' 50 if (character == '\n'){ 51 //输入完毕了 52 break; 53 } else{ 54 //保存 55 //判断是不是第一次来分配内存空间 56 if (pTemp->name == NULL) { 57 //第一次 使用malloc 58 pTemp->name = (char *)malloc(1 * sizeof(char)); 59 if (pTemp->name == NULL) { 60 exit(EXIT_FAILURE); 61 } 62 } else{ 63 pTemp->name = (char *)realloc(pTemp->name, (total+1)*sizeof(char)); 64 if (pTemp->name == NULL) { 65 exit(EXIT_FAILURE); 66 } 67 } 68 69 pTemp->name[total] = character; 70 71 total++; 72 } 73 } 74 75 //这个结点的next指针赋初值 76 pTemp->next = NULL; 77 78 //判断是将这个结点+到head 还是tail 79 if (pHead == NULL) { 80 pHead = pTemp; 81 pTail = pTemp; 82 } else{ 83 pTail->next = pTemp; 84 pTail = pTemp; 85 } 86 } 87 88 Node *pTemp = pHead; 89 while (pTemp != NULL) { 90 printf("%s\n", pTemp->name); 91 pTemp = pTemp->next; 92 } 93 printf("\n"); 94 return 0; 95 }