C语言 翁凯老师 数据结构 链表学习(1)

链表的建立

linked-list.c

#include"node.h"
#include<stdio.h>
#include<stdlib.h>

// typedef struct _node
// {
//     int value;
//     struct  _node *next;
// } Node;

int main()
{
    Node * head = NULL;//初始化
    int number;
    do{
        scanf("%d",&number);
        if(number != 1){
            //add to linked-list
            Node *p = (Node*)malloc(sizeof(Node));
            p->value = number;
            p->next = NULL;
            //find the last
            Node *last = head;
            if(last){
                 while (last->next){//遍历到last->next=NULL为止,保证数据存储在链表的最后一位
                  last = last->next;
                }
                //attach
                last->next = p;
            }else{
                head = p;
            }
        }
    }while (number != -1);

    printf("%d",head->value);//为了验证链表的有效性
    
    return 0;
}

node.h

#ifndef _NODE_H_
#define _NODE_H_

typedef struct _node
{
    int value;
    struct  _node *next;
} Node;

#endif

链表的函数

缺点:要求 使用add函数的程序员 必须做这件事情,但是我们没有办法强制他人做这件事情【如果没有head=add()对空链表不做这件事情的话就是错的】

#include"node.h"
#include<stdio.h>
#include<stdlib.h>

// typedef struct _node
// {
//     int value;
//     struct  _node *next;
// } Node;

Node* add(Node *head,int number);

// 如果是void add 函数的话就要使用全局变量Node*head 但是,最好不要用全局变量,全局变量是有害的,程序只会是一次性的,只能对这一个链表有作用

int main()
{
    Node * head = NULL;//初始化
    int number;
    do{
        scanf("%d",&number);
        if(number != 1){
            head = add(head,number);
        }
    }while (number != -1);
    printf("%d",head->value);//为了验证链表的有效性
    return 0;
}

Node* add(Node *head,int number)
{
//add to linked-list
    Node *p = (Node*)malloc(sizeof(Node));
    p->value = number;
    p->next = NULL;
    //find the last
    Node *last = head;
    if(last){
        while (last->next){//遍历到last->next=NULL为止,保证数据存储在链表的最后一位
            last = last->next;
        }
        //attach
        last->next = p;
    }else{
        head = p;
    }
    return head;
}

优化1:将*head变为**phead【head = add()没有改进】

#include"node.h"
#include<stdio.h>
#include<stdlib.h>

// typedef struct _node
// {
//     int value;
//     struct  _node *next;
// } Node;

Node* add(Node** phead,int number);

// 如果是void add 函数的话就要使用全局变量Node*head 但是,最好不要用全局变量,全局变量是有害的,程序只会是一次性的,只能对这一个链表有作用

int main()
{
    Node * head = NULL;//初始化
    int number;
    do{
        scanf("%d",&number);
        if(number != 1){
            head = add(head,number);
        }
    }while (number != -1);
    printf("%d",head->value);//为了验证链表的有效性
    return 0;
}

Node* add(Node** phead,int number)
{
//add to linked-list
    Node *p = (Node*)malloc(sizeof(Node));
    p->value = number;
    p->next = NULL;
    //find the last
    Node *last = *phead;
    if(last){
        while (last->next){//遍历到last->next=NULL为止,保证数据存储在链表的最后一位
            last = last->next;
        }
        //attach
        last->next = p;
    }else{
        head = p;
    }
    // return head;
}

优化2:用自己定义的一种数据list,代表整个链表,方便以后做修改。

eg:可以在定义一个数据,让链表存储不需要总是从第一位开始搜寻,而直接从最后一位开始存储

#include"node.h"
#include<stdio.h>
#include<stdlib.h>

// typedef struct _node
// {
//     int value;
//     struct  _node *next;
// } Node;

typedef struct _list
{
    Node* head;
    // Node* tail;
}List;

void * add(List* plist,int number);

// 如果是void add 函数的话就要使用全局变量Node*head 但是,最好不要用全局变量,全局变量是有害的,程序只会是一次性的,只能对这一个链表有作用

int main()
{
    List list;
    list.head /* = list.tail */= NULL;
    int number;
    do{
        scanf("%d",&number);
        if(number != 1){
            add(&list,number);
        }
    }while (number != -1);
   
    return 0;
}

void * add(List* plist,int number)
{
//add to linked-list
    Node *p = (Node*)malloc(sizeof(Node));
    p->value = number;
    p->next = NULL;
    //find the last
    Node *last = plist->head;
    if(last){
        while (last->next){//遍历到last->next=NULL为止,保证数据存储在链表的最后一位
            last = last->next;
        }
        //attach
        last->next = p;
    }else{
        plist->head = p;
    }
    // return head;
}

在List的中再创建一个tail指针代表尾结点,使tail永远指向新加进去的节点。这样让链表存储不需要总是从第一位开始搜寻,而直接从最后一位开始存储

#include"node.h"
#include<stdio.h>
#include<stdlib.h>

// typedef struct _node
// {
//     int value;
//     struct  _node *next;
// } Node;

typedef struct _list
{
    Node* head;
    Node* tail;//永远指向最后一个节点
}List;

void * add(List* plist,int number);

// 如果是void add 函数的话就要使用全局变量Node*head 但是,最好不要用全局变量,全局变量是有害的,程序只会是一次性的,只能对这一个链表有作用

int main()
{
    List list;
    list.head = list.tail = NULL;
    int number;
    do{
        scanf("%d",&number);
        if(number != 1){
            add(&list,number);
            // head = add(head,number);
        }
    }while (number != -1);
    printf("%d",list.tail->value);
    return 0;
}

void * add(List* plist,int number)
{
//add to linked-list
    Node *p = (Node*)malloc(sizeof(Node));
    p->value = number;
    p->next = NULL;
    //find the last
    Node *last = plist->tail;
    if(last){
        /* while (last->next){//遍历到last->next=NULL为止,保证数据存储在链表的最后一位
            last = last->next;
        }
        // attach */
        last->next = p;
        plist->tail = p;
    }else{
        plist->head = p;
        plist->tail = p;
    }
    // return head;
}

MOOC翁凯C语言期末考试是一项对学生在C语言编程方面的掌握程度进行综合评估的考试。在这次考试中,学生将会面对一系列与C语言相关的问题和编程题目。 首先,考试将会涉及C语言的基础知识,包括变量定义、运算符使用、流程控制和函数的使用等。学生需要对这些内容有清晰的理解和掌握,能够正确地应用于实际的编程问题中。 其次,考试还将要求学生能够分析和解决一些较为复杂的编程问题。这些问题可能涉及到数组、指针、结构体等高级数据结构和算法的使用。学生需要能够理解并正确应用这些概念,以解决给定的编程问题。 此外,考试可能会涉及一些C语言程序的输出结果预测和错误调试等内容。学生需要具备对C语言的程序执行过程有清晰的认识,能够正确预测程序输出结果,并有能力发现和纠正程序中的错误。 最后,考试还可能会包括一些编程题目,要求学生能够根据题目要求独立编写C语言程序。在这些题目中,学生需要展示自己的编程能力和解决问题的能力,用C语言实现要求的功能,并保证程序的正确性和健壮性。 综上所述,MOOC翁凯C语言期末考试是一次对学生在C语言编程方面的综合能力进行考察的考试。学生需要掌握C语言的基础知识,具备解决编程问题的能力,并能够独立完成一定的编程任务。该考试将帮助学生提升在C语言编程方面的能力,并为将来在计算机编程领域的学习和工作奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

某石油中专在读坐牢2021级本科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值