【关于链表】
建立一个结构数组,包含电影名称和评分,可以不断添加,对此我们可以建立以下结构
#define SIZE 45
struct film{
char title[SIZE];
int rating;
struct film * next; //尾指针,为了表明结构后面没有其他结构,将next成员指针设置为NULL(空指针)
}
struct film * head; //头指针,,指向链表中的第一项,主要用于存储第一个结构的地址
这时候,在用户输入第二部电影的信息时,程序为第二个film类型结构分配空间,把新的结构地址存储在第一个结构的next成员中(擦写了之前存储在改成员中的NULL),这样链表第一个结构中的next指针指向第二个结构,将第二个结构中的next成员设置为空指针,这样就完成了一个链表的构造。
【创建链表】
创建链表设计以下三步
1、使用malloc()函数为结构分配足够的空间
2、存储结构的地址
3、把当前信息拷贝到结构中
【显示链表】--->【释放链表】
在链表中,每一个链接点叫做节点(node),因此,我们把node作为节点结构的标记。
书中的例程中关于内存的释放是错误的,错误代码示例:
/* 依次释放指针内存 */
current = head;
while (current != NULL)
{
free(current);
head = current->next;
}
在这段代码中,首先将head赋给current,但是在后面的while循环中,直接释放了current的内存,
那么就无法实现current->next。
更正后的代码如下:
/* 依次释放指针内存 */
current = head;
while (current != NULL)
{
prev = current->next;
free(current);
current = prev;
}
更正后,将指针内存的依次释放
程序示例
/* films.c -- 使用结构链表 */
#include<stdio.h>
#include<stdlib.h> //提供malloc()函数
#include<string.h> //提供strcpy函数
#define TSIZE 45
struct film {
char title[TSIZE];
int rating;
struct film * next;
};
char * s_gets(char *st, int n);
int main()
{
struct film *head = NULL;
struct film *current; //当前
struct film *prev; //下一个
char input[TSIZE];
/* 收集并存储信息 */
puts("enter first movie title:");
while (s_gets(input, TSIZE) != NULL&&input[0] != '\0')
{
/* 初始化一个结构 */
/* current是结构的首地址、指向film结构的指针 */
current = (struct film *)malloc(sizeof(struct film));
if (head == NULL)
head = current;
else
prev->next = current;
current->next = NULL;
strcpy(current->title, input);
printf("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 list:\n");
/* 遍历链表时,创建一个新的指针,是为了保护head的值,防止其改变*/
/*否则程序就找不到链表的开始处*/
current = head;
while (current != NULL)
{
printf("movie: %s rating: %d\n", current->title, current->rating);
current = current->next;
}
/* 依次释放指针内存 */
current = head;
while (current != NULL)
{
prev = current->next;
free(current);
current = prev;
}
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;
}