内存分配的函数
void malloc(unsigned int size);创建长度为size的连续空间,返回一个起始地址的指针,如果创建内存空间失败返回NULL;
void calloc(unsigned n, unsigned size); 在内存的动态区存储中分配n个长度为size的连续空间,返回一个起始地址的指针,失败返回NULL;
void free(void p); 释放由p指向的内存区,使这部分内存区域能被其他变量使用,p使malloc或calloc函数时的返回值;
注意:在老版本C中,malloc和calloc返回的是char类型的指针,ANSI C返回的是 void 类型;
简单的链表
#include <stdio.h>struct student {long num;float score;struct student *next;};int main() {struct student a,b,c, *head, *p;a.num = 10001;a.score = 100.00;b.num = 10002;b.score = 80.00;c.num = 10003;c.score = 95.00;head = &a;a.next = &b;b.next = &c;c.next = NULL;p = head;do {printf("%ld %5.1f\n", p -> num, p -> score);p = p -> next;} while(p != NULL);}
链表
#include<stdlib.h>#include<string.h>#include<stdio.h>#define LEN sizeof(struct student)struct student {long num; // 学号float score;struct student *next;};int n;struct student *creat(void) { // 创建学生信息,输入0结束struct student *head;struct student *p1;struct student *p2;n = 0;p1 = p2 = (struct student *) malloc(LEN); // 开辟一个新单元scanf("%ld,%f", &p1 -> num, &p1 -> score);head = NULL;while (p1 -> num != 0) {n += 1;if (n == 1) {head = p1;} else {p2 -> next = p1;}p2 = p1;p1 = (struct student *) malloc(LEN);scanf("%ld,%f", &p1 -> num, &p1 -> score);}p2 -> next = NULL;return (head);}void print(struct student *head) {struct student *p;printf("\nNow, These %d records are:\n", n);p = head;if (p != NULL) {do {printf("%ld %5.1f\n", p -> num, p -> score);p = p -> next;} while (p != NULL);}}struct student *del(struct student *head, long num) { // 按学号删除struct student *p1, *p2;if (head == NULL) {printf("\nlist null! \n");return (head);}p1 = head;while (num != p1 -> num && p1 -> next != NULL) {p2 = p1;p1 = p1 -> next;}if (num == p1 -> num) {if (p1 == head) {head = p1 -> next;} else {p2 -> next = p1 -> next;}printf("delete: %ld\n", num);n -= 1;} else {printf("%ld not been found!\n", num);}return (head);}struct student *insert(struct student *head, struct student *stud) {struct student *p0, *p1, *p2;p1 = head;p0 = stud;if (head == NULL) {head = p0;p0 -> next = NULL;} else {while ((p0 -> num > p1 -> num) && (p1 -> next != NULL)) {p2 = p1;p1 = p1 -> next;}if (p0 -> num <= p1 -> num) {if (head == p1) {head = p0;} else {p2 -> next = p0;}p0 -> next = p1;} else {p1 -> next = p0;p0 -> next = NULL;}}n += 1;return (head);}int main(){struct student *head, *stu;long del_num;printf("input records:\n");head = creat();print(head);printf("\ninput the deleter number:");scanf("%ld", &del_num);while(del_num != 0) {head = del(head, del_num);print(head);printf("\ninput the deleted number:");scanf("%ld", &del_num);}printf("\ninput the inserted record:");stu = (struct student *)malloc(LEN);scanf("%ld,%f", &stu -> num, &stu -> score);while(stu -> num != 0) {head = insert(head, stu);print(head);printf("\ninput the inserted record:");stu = (struct student *)malloc(LEN);scanf("%ld,%f", &stu -> num, &stu -> score);}}
