链表的C语言实现(含动态内存分配) 上 链表的C语言实现之动态内存分配
一、为什么用动态内存分配 float score[30]; 但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大? 在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道该班级的学生数,但是如果因为某种特殊原因人数有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。 void *malloc (unsigned int size)
下例是一个动态分配的程序: #include "malloc.h" #include "stdlib.h" main(void) { /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/ int count; int *array; array=malloc(10 * sizeof(int)); if(array==NULL) { printf("Out of memory!\n"); exit(1); } /*给数组赋值*/ for(count=0;count<10;count++) { array[count]=count; } /*打印数组元素*/ for(count=0;count<10;count++) { printf("%2d\n",array[count]); } }
void free(void *p)
int *p1,*p2;
中 链表的C语言实现之单链表的实现 一、单链表的建立 typedef struct node { char name[20]; struct node *link; }stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> /*包含动态内存分配函数的头文件*/ #define N 10 /*N为人数*/ typedef struct node { char name[20]; struct node *link; }stud; stud * creat(int n) /*建立单链表的函数,形参n为人数*/ { stud *p,*h,*s;/* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/ int i;/*计数器*/ if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/ { printf("不能分配内存空间!"); exit(0); } h->name[0]='\0'; /*把表头结点的数据域置空*/ h->link=NULL; /*把表头结点的链域置空*/ p=h; /*p指向表头结点*/ for(i=0;i<n;i++) { if((s=(stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/ { printf("不能分配内存空间!"); exit(0); } p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/ printf("请输入第%d个人的姓名",i+1); scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/ s->link=NULL; p=s; } return(h); } main() { int number; /*保存人数的变量*/ stud *head; /*head是保存单链表的表头结点地址的指针*/ number=N; head=creat(number);/*把所新建的单链表表头地址赋给head*/ } 这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。
下 链表的C语言实现之循环链表及双向链表
一、循环链表 typedef struct node { int data; /*数据域*/ struct node *llink,*rlink; /*链域,*llink是左链域指针,*rlink是右链域指针*/ }JD;
|