美文网首页
单向链表

单向链表

作者: 日常表白结衣 | 来源:发表于2017-07-25 17:12 被阅读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;
    }
    

    相关文章

      网友评论

          本文标题:单向链表

          本文链接:https://www.haomeiwen.com/subject/govwkxtx.html