单向链表

2017-07-25  本文已影响0人  日常表白结衣

【关于链表】
建立一个结构数组,包含电影名称和评分,可以不断添加,对此我们可以建立以下结构

#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", &current->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;
}
上一篇下一篇

猜你喜欢

热点阅读