从数组到链表1

从数组到链表

//本博客用于记录对Stephen Prata著作的《C Primer Plus》内容的摘录
我们来处理一个数据表示的示例。假设要编写一个程序,让用户输入一年内看过的所有电影。要储存每部影片的各种信息,如片名、发行年份、导演、主演、评级等。建议使用一个结构储存每部电影,一个数组储存一年内看过的电影。为简单起见,我们规定结构中只有两个成员:片名和评级(0~10)
下面的程序清单1演示了一个基本的实现:

/* films1.c -- 使用一个结构数组*/
#include<stdio.h>
#include<string.h>
#define TSIZE 45 //储存片名的数组大小
#define FMAX 5 //影片的最大数量
struct film {
	char title[TSIZE];
	int rating;
};
char* s_gets(char str[], int lim);
int main(void)
{
	struct film movies[FMAX];
	int i = 0;
	int j;
	puts("Enter first movie title 输入第一个影片名");
	while (i < FMAX && s_gets(movies[i].title, TSIZE) != NULL &&
		movies[i].title[0] != '\0')
	{
		puts("Enter your rating <0~10>");
		scanf("%d", &movies[i++].rating);
		while (getchar() != '\n')
			continue;
		puts("Enter next movie title (empty line to stop):");
	}if (i == 0)
		printf("No data entered");
	else
		printf("Here is the movie list:\n");

	for (j = 0; j < i; j++)
		printf("Movie: %s Rating: %d\n", movies[j].title, movies[j].rating);
	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)			//如果地址不是NULL
			*find = '\0';	//在此处放置一个空字符
		else
			while (getchar() != '\n')
				continue;//处理剩余输入行
	}return ret_val;
}

该程序创建了一个结构数组,然后把用户输入的数据储存在数组中。直到数组已满(用FMAX进行判断)或者到达文件结尾(用NULL进行判断),或者在用户的首行按下Enter键(用’\0’进行判断)输入才会终止。
但是!!!!!!!
这样搞设计程序有点问题。首先,该程序很可能会浪费许多空间,因为大部分的片名都不会超过40个字符。其次,许多人会觉得每年5部电影的限制太严格了。当然,也可以放宽这个限制,但是,要多大才合适?另外,一些编译器对自动存储类别变量可用的内存数量设置了一个默认的限制,如此大型的数组可能会超过默认设置的值。可以把数组声明为静态或外部数组,或者设置编译器使用更大的栈来解决这个问题,但是,这样做并不能根本解决问题
程序真正的问题是数据表示不太灵活。程序在编译时确定所需内存量,其实在运行时确定会更好。要解决这个问题,应该使用动态内存分配来表示数据
可以这样做:

#define TSIZE 45 //储存片名的数组的大小
	struct film{
	char title[TSIZE];
	int rating;
};
...
int n,i;
struct film*movies; //指向结构的指针
...
printf("Enter the maximum number of movies you'll enter:\n");
scanf("%d",&n);
movies = (struct film *)malloc(n*sizeof(struct film));

使用malloc(),可以推迟到程序运行时才确定数组中的元素数量。所以,如果只需要20个元素,程序就不必分配存放500个元素的空间。但是,这样做的前提是,用户要为元素个数提供正确的值。

下一篇博客更新链表的引入。
——By Suki.

发布了29 篇原创文章 · 获赞 27 · 访问量 2952

猜你喜欢

转载自blog.csdn.net/Eumenides_Suki/article/details/103747525