标签:current char struct head malloc C语言 链表 NULL
一、引子
我们前面讲数组的时候,提到了创建数组的三种方法,一种是创建静态数组,一个是创建动态数组,以及使用malloc创建动态数组。然后我们可能会有一个场景,就是我们并不知道我们实际需要多大的内存,我们需要可以不确定的添加数据,这个时候,我们可能回想,这个无所谓的,直接malloc就可以了。然后这个时候就有两个方式了,一个是说我们一来就定义好300个内存空间,还有一种是我们用的时候在调用malloc。然后第一种方法就造成了两种情况的发生,如果我们所需内存少于300,就浪费了,要是所需内存多余300,就不够了。第二种方法会出现一个问题,就是我们一个数据,可能所需内存太大了,使得一个malloc存不下。然后我们想到了一个新的思路,就是我们能不能这样,就是我们每次使用的时候,就进行malloc一次,然后这个malloc正好满足我们所需的内存大小,然后我们在该内存的的一部分空间内存放一个指针,指向上一个内存的地址,这样就像火车那样连接成了一串。
例子:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define TSIZE 45 struct film { char title[TSIZE]; int rating; struct film* next; }; char* s_gets(char* st, int n); int main(void) { struct film* head = NULL; struct film* prev, * current; char input[TSIZE]; puts("Enter first movie title:"); while (s_gets(input, TSIZE) != NULL && input[0] != '\0') { current = (struct film*)malloc(sizeof(struct film)); if (head == NULL) head = current; else prev->next = current; current->next = NULL; strcpy(current->title, input); puts("Enter your rating<0-10>:"); scanf("%d", ¤t->rating); while (getchar() != '\n') continue; puts("Enter next movie title (empty line to stop)"); prev = current; } if (head == NULL) printf("No data entered"); else printf("HERE is the movie lists:\n"); current = head; while (current != NULL) { printf("Movie :%d rating:%d", current->title, current->rating); current = current->next; } current = head; while (current != NULL) { free(current); head = current->next; } printf("BYE\n"); return 0; } char* s_gets(char* st, int n) { char* ret_val; char* find; ret_val = fgets(st, n, stdin); if (ret_val) { find = strchr(st, '\n'); if (find) *find = '\0'; else while (getchar() != '\n') continue; } return ret_val; }
标签:current,char,struct,head,malloc,C语言,链表,NULL
来源: https://www.cnblogs.com/TomHard/p/16054668.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。