黑马程序员———C语言———【数据结构:单链表】

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

——————————————————————————————————————————————————————————————————

</pre><pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
    单链表思路:
    当我们在内存中用malloc申请内存空间时,内存分配的空间地址不一定是连续的,因此我们要想将这些不连续的内存空间在使用上变得
    连续起来,在不使用数组等集合的情况下,可以使用单链表。
    单链表就是一块内存空间分为两部分,一部分用来存储数据,另一部分用来存放指针,该指针指向另一个数据的地址。
    这样,只要我们设置合理,利用头数据就可以找到下一个数据(利用头数据的指针找到下一个数据)。

    问题:
    (1)头数据:先创建一个头指针,赋值NULL,后面检测改头指针是否有值,没值就给它赋值,有值就证明先前已经有数据了,这样就让上
    一个数据的指针指向新创建的这个数据。数据就连起来了。
    (2)当前数据的初始化:首先,当前结构体中会有一个指针用来指向下一个数据。在程序执行的时候,给当前的结构体指针赋值,但是该
    结构体指针变量中的指针变量成员要赋值为NULL,以便于让这个赋值为NULL的指针成员变量指向我们下一个要创建的结构体指针,如果不
    创建了,则证明被赋值为NULL的这个结构体指针变量是最后一个数据。

    细节:
    gets()的结束判断条件是:回车('\n'),在结束之前,会给已经输出的字符串的结尾加上字符串结束符'\0'。
    puts()和scanf("%s",x)输出字符串都会读到'\0',之后的不会再输出。

*/
struct Film{
    char title[40];
    int rating;
    struct Film *next;
};

int main()
{
    struct Film *head=NULL; //这里一定要赋值null
    struct Film *prev,*current;
    char input[40];
    printf("enter first movie title:");
    while(gets(input)!=NULL && input[0]!='\0'){
        current=(struct Film *)malloc(sizeof(struct Film));
        if(head==NULL){
            head=current;
        }else{
            prev->next=current;
        }
        current->next=NULL;
        strcpy(current->title,input);
        printf("please enter the movie rating:");
        scanf("%d",¤t->rating);
        if(getchar()!='\n'){
            break;
        }
        prev=current;
        printf("\n");
        printf("enter next movie title(empty line to stop):");
    }
    //展示电影列表
    //从头数据开始,所以把头数据交给current
    current=head;
    while(current!=NULL){
        printf("movie title is :%s , movie rating is %d .\n",current->title,current->rating);
        current=current->next;
    }

    //释放内存
    current=head;
    while(current!=NULL){
        free(current);
        current=current->next;
    }
    printf("bye!\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值