内存分配的函数
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);
}
}