第十二周作业

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 第十二周作业要求
我在这个课程的目标是 (1)搞清楚数组指针、指针数组、二级指针、二维数组直接的联系;(2)掌握单向链表的概念和它的一些应用。
这个作业在哪个具体方面帮助我实现目标 在我学习链表的时候不仅教会我使用一些有意义的单词,而且掌握的东西也越来越多。
参考文献 C语言程序设计II第十一章

6-1 计算最长的字符串长度 (15 分)

本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。
函数接口定义:
int max_len( char *s[], int n );
其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。
裁判测试程序样例:

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

#define MAXN 10
#define MAXS 20

int max_len( char *s[], int n );

int main()
{
    int i, n;
    char *string[MAXN] = {NULL};

    scanf("%d", &n);
    for(i = 0; i < n; i++) {
        string[i] = (char *)malloc(sizeof(char)*MAXS);
        scanf("%s", string[i]);
    }
    printf("%d
", max_len(string, n));

    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
4
blue
yellow
red
green
输出样例:
6

实验代码

int max_len( char *s[], int n ){
	int max=0;
	int i,j;
    for(i=0;i<n;i++){
		if(strlen(s[max])<strlen(s[i])){
			max=i;
            	}
	}	
	return strlen(s[max]);
} 

具体思路

遇到的问题及解决方法

这个问题不是特别大,还是很简单的。

正确截图

6-2 统计专业人数 (15 分)

本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:
struct ListNode {
char code[8];
struct ListNode next;
};
这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02。
函数接口定义:
int countcs( struct ListNode head );
其中head是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。
裁判测试程序样例:

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

struct ListNode {
    char code[8];
    struct ListNode *next;
};

struct ListNode *createlist(); /*裁判实现,细节不表*/
int countcs( struct ListNode *head );

int main()
{
    struct ListNode  *head;

    head = createlist();
    printf("%d
", countcs(head));
    
    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
1021202
2022310
8102134
1030912
3110203
4021205

输出样例:
3

实验代码

int countcs( struct ListNode *head )
{
    int len = 0;
    while(head)
    {
        if(head->code[1] == '0' && head->code[2] == '2')
            len++;
        head = head->next;
    }
    return len;
}

具体思路

遇到的问题及解决方法

这个题目刚开始用的是定义了另一个指针,然后在for语句中时条件错了,后来就用了另一种while发现简单很多,后来又想,只要把那逗号改成&&可能就对了,但是没有尝试,至少知道了另一种思路,还是非常棒的,其它就没啥问题了。

正确截图

6-3 删除单链表偶数节点 (20 分)

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
struct ListNode {
int data;
struct ListNode next;
};
函数接口定义:
struct ListNode createlist();
struct ListNode deleteeven( struct ListNode head );
函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。
裁判测试程序样例:

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

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("
");
}

int main()
{
    struct ListNode *head;

    head = createlist();
    head = deleteeven(head);
    printlist(head);

    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7

实验代码

typedef struct ListNode *List;
struct ListNode *createlist()
{   
    List head=NULL, tail=NULL;
    int t;
    scanf("%d",&t);
    while(t != -1){
        List temp = (List)malloc(sizeof(struct ListNode));
        temp->data = t;
        temp->next = NULL;
        if(tail==NULL)
            head = tail = temp;
        else{
            tail->next = temp;
            tail = temp;
        }
        scanf("%d",&t);
    }
    return head;
}

struct ListNode *deleteeven( struct ListNode *head )
{
    List p=head,q;
    while(head && head->data%2==0){ 
        p = head;
        head = head->next;
        free(p);
    }
  
    p = head;
    while(p && p->next){
        while(p->next && p->next->data%2==0){
            q = p->next;
            p->next = q->next;
        }
        p = p->next;
    }
    return head;
}

具体思路


遇到的问题及解决方法


正确截图


预习中的疑惑

最后一周时间确实比较紧,我都没什么时间去预习,但还是简单的看了一下,学习了链表,看了其中的很多应用,给我的感觉就是只要搞懂每些单词的意义就不太难。

对自己作业的评价

对于自己的作业不是很满意,因为我每次都没有完成挑战题,原因有以下两点:(1)没有太多的时间花在专业上,尤其是周末就更没有时间了,所以写专业作业我还得抽出时间学习和写代码。
(2)挑战题没有很勇敢的去尝试,总认为难,做不出来会浪费我很多时间,所以对自己作业很不满意。

学习进度条

这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
第一周 六个小时左右 102 学习了数组 对于数组的使用不太熟悉
第二周 八个小时左右 98 学习了文件,学会使用文件去处理代码 对于文件的一些操作
第三周 十个小时 124 学习了二维数组 暂时没有
第四周 十多个小时 134行 学习了最多的是利用for语句和数组使那些数按顺序排好 目前是编程经常错,好难编
第五周 9个多小时 121行 字符串头文件:#include<string.h>.字符串函数:strcpy.字符和字符串的区别。 对于指针的的理解还不是很深
第六周 七小时 100行左右 学会使用指针定义函数,然后就是学会使用指针返回多个函数值 对于比较复杂的转化还存在困难
第七周 12小时左右 140多行 通过学习更加了解指针了,还有数组与指针结合以及他们的关系 对于那些挑战题,感觉无从下手
第八周 14小时 200行左右 这周学习了结构,然后学习了比较多的函数 对于那些新函数理解的还不是很深刻
第九周 10小时 150行左右 这周就是继续练习结构,然和更深层次的理解结构多种形式 目前对于结构指针和结构数组不是特别理解
第十周 8小时 100行左右 这周虽然虽然没有编程题,但是还是在不断学习知识的 预习了递归 对于递归理解不够深刻
第十一周 15小时 200行左右 这周真是在做有关递归的编程题,但是感觉做题的时候只可意味,不可言传,要理解就得靠自己 对于递归的运用任然知之甚少
第十二周 8小时 120行左右 这周学习了使用链表,然后去应用 里面的单词大多,所以要仔细去写

学习感悟

我感觉自己就是在混专业,因为学了一年的C语言,但是自己花的时间太少,学的过慢,这是我必须检讨自己的,看着两个室友都在不断地往深的地方学,而自己还学的不够多就觉得有种失落感,所以我要向他们学习这种精神。感悟颇深,但是我知道,只有多花时间在专业才有可能进步,向前看齐。

原文地址:https://www.cnblogs.com/521-PENG/p/10881607.html