zoukankan      html  css  js  c++  java
  • 指针与数据结构算法_链表(C语言)

    一.变量:

       声明一个变量系统是没有给这个变量分配内存空间的:

    例:

    int j;//编译的时候是没有分配内存空间的
    int i=3;//计算机在编译的时候就会给这个i分配4个字节的内存空间

    二.malloc动态分配内存地址:

    回想一下:我们在程序中存储一个整数10;除了使用int a;在内存中申请一块区域来存储,还有一种方法:
                  malloc(4);                    //从内存中申请4个字节大小的内存存放整数10
      在C中经常看到这样的写法:
            (int *)malloc(sizeof(int));  //sizeof(获取int类型所占的字节数)
                                                    //(int *)表示申请的这些字节数用于存放int类型的整数
    例:
    #include <stdio.h>
    #include <stdlib.h>
     int main()
     {
         int b;
         b=(int)malloc(sizeof(int));  //没有这句话,变量b 是不占内存的,printf输出就会空指针异常;有这句话,就输出的申               请的内存地址
         printf("%d",b);
         system("pause");
         return 0;
     }

    三.C中的*和&:

           *:代表取内存中的值(*还有乘法运算,这个就不多解释了)
           &: 代表获取的是变量的地址
           **:二级指针(就是地址里面存放第三个变量的地址地址)
           ->:结构体指针运算符(用于访问结构体内部成员的)
     
    例(二级指针的例子):
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int a[]={1,2,3,4,5};//这个数组里存入的是具体的数据
        int *num[]={&a[0],&a[1],&a[2],&a[3],&a[4]};//这个数组里面就是全部存的数内存地址,并不是数据
        int **p,i;
        p=num;
        for (i = 0; i < 5; i++)//注意这里,C语言是不能在这里进行变量的定义的如:int i
        {
            printf("%d	",**p);//这里的p表示num数组的首地址,*p表示num[1]的值,也就是a[0]的地址,**p就是值了
            p++;//指针向下移一格
        }
        system("parse");
        return 0;
    }
    四.链表(遍历):
    根据以上知识点,就可以进行简单的链表的遍历了
    例:
    #include <stdio.h>
    #include <stdlib.h>
     struct note
     {
         int data;
         struct note *next;
     };
    int main()
     {
         struct note *head,*p,*q,*t;//
         int i,n,a;
         scanf("%d",&n);//有多少个数
         head=NULL;//头指针初始化为空
         for (i = 0; i < n; i++)//循环读取n个数
         {
             scanf("%d",&a);
             p=(struct note *)malloc(sizeof(struct note));//动态申请一个节点的空间,存放节点
             p->data=a;//将数据存入data中
             p->next=NULL;//设置当前指针的后续指针指向空
             if(head==NULL)
             {
                 head=p;//如果这是第一个创建的节点,就让头指针指向这个
             }
             else
             {
                 q->next=p;//如果不是第一个节点,就让前一个的后续指针指向当前节点
             }
             q=p;//在将q也指向当前节点
         }
         t=head;
         while (t!=NULL)
         {
             printf("%d	",*t);
             t=t->next;   //继续下一个节点
         }
         system("pause");
    return 0; }
    五.后记:
     
             以上只是对链表进行了遍历,链表数据的添加删除,后续继续更新
     
  • 相关阅读:
    Disruptor-NET和内存栅栏
    SSDB:高性能数据库服务器
    PostgreSQL配置优化
    ADO.NET的弹性连接控制[ADO.NET idle connection resiliency]
    2013年度IT博客大赛跻身10强
    MongoDB 聚合管道(Aggregation Pipeline)
    验证码类库CaptchaMvc
    AngularJS SPA Template For Visual Studio
    .NET 4.0 版本号
    利用SSH Filesystem实现远程文件系统
  • 原文地址:https://www.cnblogs.com/fengxuehuanlin/p/5423386.html
Copyright © 2011-2022 走看看