美文网首页
单向链表

单向链表

作者: 日常表白结衣 | 来源:发表于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;
}

相关文章

  • 8.单向链表SingleLinkList

    目录:1.单向链表的定义2.单向链表的图解3.单向链表定义操作4.单向链表的实现 1.单向链表的定义 2.单向链表...

  • 线性表-单向循环链表

    为了方便,本文介绍的单向循环链表不包含头节点 单向循环链表内容 单向循环链表的的定义 单向循环链表的创建 单向循环...

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 数据结构与算法——线性表3

    线性表——单向循环链表 3、单向循环链表 在单向链表的基础上,单向链表的尾结点的Next指向链表的头部,就是为循环...

  • 04单向循环链表实现总结

    一、说说什么是单向循环链表? 人狠话不多. 上图. 单向循环链表就是这个样子!单向循环链表.png 与单向链表区别...

  • 数据结构基础--单向循环链表

    单向循环链表 单向循环链表是可循环的单链表,它与单链表的区别在于单向链表的最后一个元素的指针域为空,而单向循环链表...

  • 2019-12-04 Java-LinkedList源码解读

    @TOC 1、链表数据结构 链表分为单向链表和双向链表,他们的区别在于,单向链表只能单向寻址,而双向链表可以双向寻...

  • 数据结构与算法之循环链表(3.4)

    目录 单向循环链表双向循环链表约瑟夫问题如何发挥循环链表的最大威力? 一 单向循环链表 单向循环链表 - 只有一个...

  • day03-双向链表

    双向链表: 单向链表只能单向查找,双向链表可以双向查找。 啥是双向链表? 双向链表可以双向查数据,所以就不存在单向...

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

网友评论

      本文标题:单向链表

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