在正式创建一个动态链表之前,先来看C语言中用来动态分配内存的calloc()和malloc()函数。
calloc()和malloc()函数
calloc()和malloc()是标准C库中提供了两个函数,用于在运行时分配堆内存。他们都在标准头文件<stdlib.h>
中声明,所以,如果要使用这两个动态内存分配函数,应用程序必须包含这个头文件。
如果分配成功,将返回void(C语言中通用指针类型)类型指针,指向刚分配的内存空间;如果分配失败,则返回NULL。
calloc()
calloc()函数接收两个参数,指定要提供元素个数以及每个元素的大小(字节数),并且返回指向给内存开头区域的指针。
1 2
| #include <stdlib.h> void *calloc(size_t num, size_t size);
|
calloc()函数返回的指针类型为void,所以通常我们需要将其强制转换为适当类型的指针。
其存储区域将被自动设定为0。
malloc()
malloc()函数和calloc()工作方式相似,不过它只接收一个参数:所分配空间的总字节数。
另外,其存储区域不会自动设定为0。
1 2
| #include <stdlib.h> void *malloc(size_t size);
|
sizeof运算符
sizeof用起来像一个函数,但它实际上是一个运算符,其以字节为单位返回指定项目的大小。
1 2
| sizeof(int) sizeof(struct student)
|
小案例
回到动态分配内存的话题,如果希望在程序中为1000个整数分配足够的内存,我们有以下两种方式:
1 2 3 4 5 6 7 8 9
| #include <stdlib.h> int *intp; intp = (int *)calloc(sizeof(int), 1000); intp = (int *)malloc(1000*sizeof(int));
|
动态链表C语言实现
现在可以来实现一个创建单链表的函数,让用户输入节点信息,并且以student.age=0作为结束。最后在主函数中,打印出所有的节点信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <stdio.h> #include <stdlib.h> struct student { char name[20]; int age; struct student *next; }; struct student * create () { typedef struct student stu_t; stu_t *head, *p1, *p2; head = p1 = p2 = (stu_t *)malloc(sizeof(stu_t)); scanf("%s %d", p1->name, &p1->age); while (p1->age != 0) { p2 = p1; p1 = (stu_t *)malloc(sizeof(stu_t)); p2->next = p1; scanf("%s %d", p1->name, &p1->age); } p1->next = NULL; return head; }; int main () { struct student *s; s = create(); while (s->next != NULL) { printf("name=%s,age=%d\n", s->name, s->age); s = s->next; } return 0; }
|
运行结果如下:
这样就实现了动态链表的创建,关于链表的增加、删除等功能,后期再逐渐完善。