首页 > 其他分享 >本周(2024.1.8-2024.1.14)C语言学习小结

本周(2024.1.8-2024.1.14)C语言学习小结

时间:2024-01-14 19:45:44浏览次数:44  
标签:2024.1 head NULL struct int next link C语言 14

既然之前说了要尝试坚持写博客,那就试试吧。本周花在C语言上的时间不多,简要回顾一下。

动态数组

学习并实践了基本的动态数组知识,即calloc、malloc、relloc、free。以下是基本综合所学内容写的代码,实现动态数据添加。

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

int main()
{
    int n, OnceNum, Size, CurrentNum = 0;
    int *arr, *stick;
    char select;

    printf("Please enter the inital size of the array:");  //设定数组初始大小
    scanf("%d", &n);

    arr = malloc(n * sizeof(int)); 
    stick = arr;
    if (arr == NULL) // 判断是否成功创建数组
    {
        printf("NULL!\n");
        return 1;   
    }
    Size = n * sizeof(int);

    printf("Do you want to append elment(s)? Y/N:"); //询问是否进行赋值
    scanf(" %c", &select);

    while (select == 'Y' || select == 'y')
    {
        printf("How many?"); //赋值数据的数量
        scanf("%d", &OnceNum);

        if (CurrentNum + OnceNum <= n) //判断是否超出数组大小
        {
            for (int i = 1; i <= OnceNum; i += 1)
            {
                printf("Please enter:");
                scanf("%d", arr);
                arr++;
            }
            CurrentNum += OnceNum;
        }
        else
        {
            printf("Current space is not enough...Please wait and enter again.\n"); //超出数组原大小则扩大数组
            realloc(stick, (n * 2) * sizeof(int));
            n *= 2;
            if (stick == NULL)
            {
            printf("NULL!\n");
            return 1;   
            }
        }

        printf("Current data : "); //显示当前数组数据
        for (int i = 0; i < CurrentNum; i += 1)
        {
            printf("%d ", stick[i]);
        }
        printf("\n");

        printf("Do you want to append element(s)? Y/N:");
        scanf(" %c", &select);
    }

    printf("\nFinal data : "); //显示最终数组数据
    for (int i = 0; i < CurrentNum; i += 1)
    {
        printf("%d ", stick[i]);
    }
    printf("\n");

    free(stick); //释放数组空间
    printf("\nbye\n");
}

简单的单向链表

学习了基础的单向链表知识,并尝试写一个涵盖全部基本操作(创建、插入、删除等)的程序,但是实际写代码的过程中bug一个接一个地来,修完一个又来一个,导致原定的计划并未完成,节点的删除已经释放都还没做好,以下是半成品代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct link //定义链表结构体
{
    int data;
    struct link *next;
};

void Display(struct link *head) // 显示链表全部数据
{
    struct link *display = head;
    int n = 1;
    while (display != NULL)
    {
        printf("Node%d: %d\n", n, display -> data);
        display = display -> next;
        n += 1;
    }
}

void AddNode(struct link **head) //新增节点
{
    int rank;
    struct link *guide = *head;
    struct link *NN = NULL;
    NN = (struct link *)malloc(sizeof(struct link));
    NN -> next = NULL;
    scanf("%d %d", &NN -> data, &rank);
    for (int i = 1; i < rank - 1; i += 1)
    {
        guide = guide -> next;
    }
    if (guide == NULL) //超出链表,插至尾节点
    {
        guide = NN;
    }
    else if (guide -> next == NULL) //插至尾节点
    {
        guide -> next = NN;
    }
    else if (rank == 1) //插至首节点
    {
        NN -> next = guide;
        *head = NN;
    }
    else //插至中间特定位置
    {
        NN -> next = guide -> next;
        guide -> next = NN;
    }
    
}

void DeleteNode() //删除节点
{

}

void Free(struct link *head) //释放链表空间
{
    struct link *f = head, *temp = NULL;
    while (f != NULL)
    {   
        temp = f;
        f = f -> next;
        if (f != NULL)
        free(temp);
    }
}

int main()
{
    int n = 1;
    struct link *head = NULL;
    struct link N1, N2;

    head = &N1;
    scanf("%d", &N1.data);

    N1.next = &N2; 
    N2.next = NULL;
    N2.data = 0;

    AddNode(&head);
    AddNode(&head);
    Display(head);
    DeleteNode();
    DeleteNode();
    Display(head);
    Free(head);
    return 0;
}

期间频繁出错的就在新增节点AddNode部分,遇到不少问题:

  • 没想到用malloc新增节点;
  • 首节点情况没有单独列出;
  • 起初函数参数是*head,即修改的指针是形参,参数未传递指针的指针(或者用return也行);
  • 没分清结构体指针与结构体
  • ……

其他编程练习

也做了写一点点oj平台上的编程题,其中有一道“从字符串提取数字”没做好,当时没想到用for+while循环嵌套实现更灵活。

标签:2024.1,head,NULL,struct,int,next,link,C语言,14
From: https://www.cnblogs.com/zzz12138/p/17964071

相关文章

  • 1.14
    霍金奔向萝莉岛。昨天放假了,玩了3个小时手机,rks+=0.01。在机房留下卫生纸就意味着抛弃它。推歌テリトリーバトル-ツユ听起来很好听可是歌词很悲伤啊。没搞到歌词,输。没有学科学术。没有学术。快期末考试了,所以根据一些人的要求,以后好像不能来机房了,输。期......
  • 1/14 学习进度笔记
    PythonOnSpark的执行流程分布式代码执行的重要特征?代码在集群上运行,是被分布式运行的。在Spark中,非任务处理部分由Driver执行(非RDD代码)任务处理部分是由Executor执行(RDD代码)Executor的数量可以很多,所以任务的计算是分布式在运行的。Pyspark的架构体系?PythonOnSpark......
  • 2024.1.14-每日进度笔记
    今天,我主要尝试了对之前的几个python脚本进行整合,使得可以输入图片路径,题目,总分进行评价 参考:百度文心一言的回复 #-*-coding:utf-8-*-importosimportsysimporterniebotfromPILimportImagefrompaddleocrimportPaddleOCR,draw_ocrdefbaidu_paddleocr......
  • CF-514-D-单调队列
    514-D题目大意给定\(n\)个人,每个人有\(m\)个属性,第\(i\)个人的第\(j\)个属性值为\(a[i][j]\)。最多可以执行\(k\)次操作,每次操作选定一个属性,把所有人的该属性减\(1\),求一段最长的区间,满足执行所有操作之后该区间中所有人的所有属性全部为\(0\)。Solution转换一下思考方向,求......
  • [刷题班] LeetCode1480. 一维数组的动态和
    题目描述思路:前缀和前缀和数组(prefixSum)的构造方法一:classSolution{publicint[]runningSum(int[]nums){int[]preSum=newint[nums.length];preSum[0]=nums[0];for(inti=1;i<nums.length;i++){preSum[i]......
  • 「C语言程序设计」程序设计的基本概念
    算法的特性有穷性:算法必须在执行有限的步骤后终止,不会无限循环或进入死循环确定性:算法的每个步骤必须明确定义,没有歧义。相同输入应产生相同的输出可执行性:算法中的每个步骤都必须能够被执行,不会包含无法实现的操作有零个或多个输入:算法可以接受零个或多个输入参数,这些参数是......
  • 2023.9 ~ 2024.1 总结
    前言本文没有知识总结,只记录一些本学期思维上提升的和对自己学习状态的总结(当然知识总结也是有的,但是我太菜了,还不全面)1.个人习惯反思可跳过,主要写给自己一个学期过去了,成长还是有的,但是还是两个老毛病:浮躁,静不下心心态不稳听课情景1:听课时想要记笔记,然后就跟......
  • 柔性数组——《初学C语言第56天》
    //////————柔性数组(柔性数组在结构体中只能存在一个)////C99中,结构体中的最后一个元素(成员变量)允许是未知大小的数组,这就叫做“柔性数组”成员。//typedefstructst_type//{// inti;// inta[0];//柔性数组成员//}type_a;////有些编译器会报错无法编译可以改成://type......
  • CF414B - Mashmokh and ACM
    思路dp。dp[i][j]表示第i位填j时的方案数ac代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;consti64inf=8e18;typedefpair<int,int>pii;constintmod=1e9+7;constintN=2e3+5;intdp[N][N];vector<int>g[N];voi......
  • 【C语言】全局变量与局部变量
    在不同的函数之间传递数据时,可以使用如下方法:参数:通过形参和实参返回值:用return语句返回计算结果全局变量全局变量与局部变量全局变量:函数之外定义的变量称为全局变量(外部变量);局部变量:在一个函数内部定义的变量称为局部变量(内部变量)。全局变量使用:#include<stdio.h......