单向链表

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

#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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • C语言中,我们在使用数组时,会需要对数组进行插入和删除的操作,这时就需要移动大量的数组元素,但在C语言中,数组属于...
    正义的程序员阅读 4,072评论 0 3
  • 读到了这篇文章,写的很清晰明了,摘抄下了一些自认为比较清晰明了的部分,然后整理了一下 何为链表 链式结构是一种使用...
    奋斗小青年Jerome阅读 973评论 0 0
  • 因为不是CS科班,一个科研狗偏偏要来码代码,以前没有系统学习过数据结构和算法的知识,后期实践中越来越觉得基础的重要...
    YoungBek阅读 364评论 2 5
  • 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列...
    大雄記阅读 2,442评论 0 12
  • 人,其实不需要太多的东西, 只要健康地活着,真诚地爱着, 也不失为一种富有。 想不开,就不想, 得不到,就不要, ...
    钟升龙阅读 354评论 0 0