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 }

 

posted @ 2015-12-15 19:02  芥末勾勒  阅读(384)  评论(0编辑  收藏  举报