指针与数据结构算法_链表(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\t",**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=t->next; //继续下一个节点 } system("pause");
return 0; }
五.后记:
以上只是对链表进行了遍历,链表数据的添加删除,后续继续更新