学了好久的C语言,终于开始学处理数据啦 ~
假设存储看过的电源和此电源的评级
#define TSIZE 40
#define FMAX 5
struct film
{
char title[TSIZE];
int rating;
};
struct film movies[FMAX];
可用 movies 数组来存储看过的电影,但是:
- 电影数量是固定的,如果定义数组太大但是没存满无异于浪费空间。
- 电影名称大小是固定的,也会出现占用空间的问题。
用 malloc() 方法分配内存
用 malloc() 分配存储位置,可调整存储电影数量的大小,还可不确定的添加数据。
#define TSIZE 40
struct film
{
char title[TSIZE];
int rating;
};
struct film * movies;
movies = (struct film *) malloc(n * sizeof(struct film));
此时可按需分配存储空间。
直接使用 malloc() 分配 5 个空间,这样存储空间是连续的。如果使用 5 次 malloc() ,这样存储空间就有可能不连续了。怎么找到存储数据的位置呢?
此时有个办法:每次使用 malloc() 时,也为新分配的空间的地址分配空间。
#define TSIZE 40
struct film
{
char title[TSIZE];
int rating;
struct film * next;
};
结构体中添加第三项成员,存储下一个结构体的地址,用于指向下一个结构体的存储空间。
類 看!这种定义就有链表的意思了吧!
链表(linked list)
需要用一个单独的指针存储第一个结构的地址!这个指针称为头指针(head pointer)
头指针指向链表中的第一项。
如果没有下一项,则本项第三个元素指向下一项的指针应该为空(NULL)。
假设分配第二项的存储空间,则把第二项的地址存入第一项的 next 中。
链表使用示例
#define TSIZE 40
struct film
{
char title[TSIZE];
int rating;
struct film * next;
};
s_gets(char * st, int n)是自定义的函数!
int main(void)
{
struct film * head = NULL; //定义头指针
strucy film * prev, * current;
char input [TSIZE];
put("Enter first movies title:");
while(s_get(input,TSIZE)!=NULL && input[0]!=' ')
{
current = (struct film *) malloc(sizeof(struct film)); //分配一个内存空间
if (head == NULL)
head = current;
else
prev->next = current; //为当前结构体的第三个元素写入下一结构体的地址
current->next = NULL; //下一结构体指向后一结构体的指针为0,表示最后一结构体
strcpy(current->title,input);
put("Enter your rating<1-10>:");
scanf("%d",¤t->rating);
while(getchar() != 'n')
continue;
put("Enter next movie title:");
prev = current; //将刚分配的结构体置为当前结构体
}
if(head == NULL)
printf("No data!");
else
printf("Movie list:n");
current = head; //当前结构
while(current != NULL)
{
printf("Move:%s Rating:%d",current->title,current->rating);
current = current->next; //下一结构置为当前结构
}
current = head;
while(current != NULL)
{
head = current->next;
free(current);
current = head;
}
return 0;
}
需要注意一点!释放内存时要每个都释放,不能只释放头指针指向内存。
其中:本程序没有检测内存是否分配成功!而且没有实现删除链表中的项的代码,若需用在项目,需添加必要判断代码。
⛰️今日份学习目标达成!
表情包挺好看吧 ~ emojixd 自己搜吧 !



