zoukankan      html  css  js  c++  java
  • 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         //判断这个字符是不是回车键
    
    15         if (temp == '
    ') {
    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
    ", 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             //判断这个字符是不是'
    '
    50             if (character == '
    '){
    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
    ", pTemp->name);
    91         pTemp = pTemp->next;
    92     }
    93     printf("
    ");
    94     return 0;
    95 }
  • 相关阅读:
    PHP分页类
    phpexcel 控制导出数据内容和行数
    phpexcel 导入 和 导出
    PHP无限极分类
    php 对查询结果集进行排序
    php 删除文件夹及文件夹内文件函数
    php 字符串截取函数
    php 获取用户登录的ip
    js layer页面层加载新网站
    分享到qq
  • 原文地址:https://www.cnblogs.com/immustard/p/5049160.html
Copyright © 2011-2022 走看看